/ Hex Artifact Content
Login

Artifact ed008d999a9851c561874d8101ef9b759acd19c6cc1dbbb51461abe055f4368c:


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 23 69 66 64 65 66 20  .#endif..#ifdef 
2450: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 48  SQLITE_ENABLE_SH
2460: 41 52 45 44 5f 53 43 48 45 4d 41 0a 2f 2a 0a 2a  ARED_SCHEMA./*.*
2470: 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
2480: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  se connection wa
2490: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 74 68  s opened with th
24a0: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  e SQLITE_OPEN_SH
24b0: 41 52 45 44 5f 53 43 48 45 4d 41 0a 2a 2a 20 66  ARED_SCHEMA.** f
24c0: 6c 61 67 20 73 70 65 63 69 66 69 65 64 2c 20 74  lag specified, t
24d0: 68 65 6e 20 65 6e 73 75 72 65 20 74 68 61 74 20  hen ensure that 
24e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
24f0: 65 6d 61 20 66 6f 72 20 64 61 74 61 62 61 73 65  ema for database
2500: 20 69 44 62 0a 2a 2a 20 69 73 20 6c 6f 61 64 65   iDb.** is loade
2510: 64 2e 20 45 69 74 68 65 72 20 62 79 20 6f 62 74  d. Either by obt
2520: 61 69 6e 69 6e 67 20 61 20 53 63 68 65 6d 61 20  aining a Schema 
2530: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 65 20  object from the 
2540: 73 63 68 65 6d 61 2d 70 6f 6f 6c 2c 20 6f 72 0a  schema-pool, or.
2550: 2a 2a 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  ** by reading th
2560: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2570: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2580: 74 61 62 6c 65 2e 20 55 6e 6c 65 73 73 20 69 74  table. Unless it
2590: 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68   is NULL, .** th
25a0: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 64 69 63  e location indic
25b0: 61 74 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  ated by paramete
25c0: 72 20 70 62 55 6e 6c 6f 61 64 20 69 73 20 73 65  r pbUnload is se
25d0: 74 20 74 6f 20 31 20 69 66 20 61 20 73 68 61 72  t to 1 if a shar
25e0: 65 64 2d 73 63 68 65 6d 61 20 0a 2a 2a 20 69 73  ed-schema .** is
25f0: 20 6c 6f 61 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   loaded..**.** I
2600: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
2610: 61 6e 64 6c 65 20 77 61 73 20 6e 6f 74 20 6f 70  andle was not op
2620: 65 6e 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  ened with SQLITE
2630: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 5f 53 43 48  _OPEN_SHARED_SCH
2640: 45 4d 41 2c 20 6f 72 0a 2a 2a 20 69 66 20 74 68  EMA, or.** if th
2650: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 64 61 74  e schema for dat
2660: 61 62 61 73 65 20 69 44 62 20 69 73 20 61 6c 72  abase iDb is alr
2670: 65 61 64 79 20 6c 6f 61 64 65 64 2c 20 74 68 69  eady loaded, thi
2680: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2690: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
26a0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26b0: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
26c0: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
26d0: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
26e0: 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e 20 65 72  ise. If.** an er
26f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2700: 72 6e 65 64 2c 20 28 2a 70 7a 45 72 72 29 20 6d  rned, (*pzErr) m
2710: 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
2720: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
2730: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  * containing an 
2740: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
2750: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
2760: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
2770: 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e  aller to.** even
2780: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
2790: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
27a0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
27b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65  .int sqlite3Sche
27c0: 6d 61 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a  maLoad(sqlite3 *
27d0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
27e0: 20 2a 70 62 55 6e 6c 6f 61 64 2c 20 63 68 61 72   *pbUnload, char
27f0: 20 2a 2a 70 7a 45 72 72 29 7b 0a 20 20 69 6e 74   **pzErr){.  int
2800: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2810: 0a 20 20 69 66 28 20 49 73 53 68 61 72 65 64 53  .  if( IsSharedS
2820: 63 68 65 6d 61 28 64 62 29 20 0a 20 20 20 20 20  chema(db) .     
2830: 20 26 26 20 44 62 48 61 73 50 72 6f 70 65 72 74   && DbHasPropert
2840: 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63  y(db, iDb, DB_Sc
2850: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 0a  hemaLoaded)==0 .
2860: 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e 69 6e        && (db->in
2870: 69 74 2e 62 75 73 79 3d 3d 30 20 7c 7c 20 28 69  it.busy==0 || (i
2880: 44 62 21 3d 31 20 26 26 20 64 62 2d 3e 69 6e 69  Db!=1 && db->ini
2890: 74 2e 69 44 62 3d 3d 31 29 29 0a 20 20 29 7b 0a  t.iDb==1)).  ){.
28a0: 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
28b0: 65 33 49 6e 69 74 49 6e 66 6f 20 73 76 20 3d 20  e3InitInfo sv = 
28c0: 64 62 2d 3e 69 6e 69 74 3b 0a 20 20 20 20 6d 65  db->init;.    me
28d0: 6d 73 65 74 28 26 64 62 2d 3e 69 6e 69 74 2c 20  mset(&db->init, 
28e0: 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  0, sizeof(struct
28f0: 20 73 71 6c 69 74 65 33 49 6e 69 74 49 6e 66 6f   sqlite3InitInfo
2900: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
2910: 69 74 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20  ite3InitOne(db, 
2920: 69 44 62 2c 20 70 7a 45 72 72 2c 20 30 29 3b 0a  iDb, pzErr, 0);.
2930: 20 20 20 20 64 62 2d 3e 69 6e 69 74 20 3d 20 73      db->init = s
2940: 76 3b 0a 20 20 20 20 69 66 28 20 70 62 55 6e 6c  v;.    if( pbUnl
2950: 6f 61 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  oad && rc==SQLIT
2960: 45 5f 4f 4b 20 26 26 20 69 44 62 21 3d 31 20 29  E_OK && iDb!=1 )
2970: 20 2a 70 62 55 6e 6c 6f 61 64 20 3d 20 31 3b 0a   *pbUnload = 1;.
2980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2990: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
29a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
29b0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29d0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29e0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29f0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2a00: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2a10: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a20: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a30: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a40: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a50: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a60: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
2a70: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
2a80: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
2a90: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
2aa0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
2ab0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
2ac0: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
2ad0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2ae0: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2af0: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2b00: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2b10: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2b20: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
2b30: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2b40: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
2b50: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
2b60: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
2b70: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
2b80: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
2b90: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
2ba0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
2bb0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
2bc0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2bd0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2be0: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2bf0: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2c00: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
2c10: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
2c20: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
2c30: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
2c40: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
2c50: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
2c60: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c  ( zDatabase!=0 |
2c70: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
2c80: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2c90: 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
2ca0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2cb0: 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  ION.  /* Only th
2cc0: 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20  e admin user is 
2cd0: 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20  allowed to know 
2ce0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f  that the sqlite_
2cf0: 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  user table.  ** 
2d00: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20  exists */.  if( 
2d10: 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76  db->auth.authLev
2d20: 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26  el<UAUTH_Admin &
2d30: 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
2d40: 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30  hTable(zName)!=0
2d50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2d60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  ;.  }.#endif.  w
2d70: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72  hile(1){.    for
2d80: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2d90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2da0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  .      int j = (
2db0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2dc0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2dd0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2de0: 20 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62        if( zDatab
2df0: 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2e00: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2e10: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2e20: 44 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  DbSName)==0 ){. 
2e30: 20 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f         int bUnlo
2e40: 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ad = 0;.        
2e50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
2e60: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
2e70: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
2e80: 20 20 20 20 69 66 28 20 49 73 53 68 61 72 65 64      if( IsShared
2e90: 53 63 68 65 6d 61 28 64 62 29 20 29 7b 0a 20 20  Schema(db) ){.  
2ea0: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
2eb0: 50 61 72 73 65 20 3d 20 64 62 2d 3e 70 50 61 72  Parse = db->pPar
2ec0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se;.          if
2ed0: 28 20 70 50 61 72 73 65 20 26 26 20 70 50 61 72  ( pParse && pPar
2ee0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
2f00: 65 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 53  e->rc = sqlite3S
2f10: 63 68 65 6d 61 4c 6f 61 64 28 64 62 2c 20 6a 2c  chemaLoad(db, j,
2f20: 20 26 62 55 6e 6c 6f 61 64 2c 20 26 70 50 61 72   &bUnload, &pPar
2f30: 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  se->zErrMsg);.  
2f40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2f50: 61 72 73 65 2d 3e 72 63 20 29 20 70 50 61 72 73  arse->rc ) pPars
2f60: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f80: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2f90: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2fa0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2fb0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2fc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2fd0: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2fe0: 20 20 20 20 20 69 66 28 20 62 55 6e 6c 6f 61 64       if( bUnload
2ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3000: 6c 69 74 65 33 53 63 68 65 6d 61 52 65 6c 65 61  lite3SchemaRelea
3010: 73 65 28 64 62 2c 20 6a 29 3b 0a 20 20 20 20 20  se(db, j);.     
3020: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3030: 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20 66 6f   }.    /* Not fo
3040: 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  und.  If the nam
3050: 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b 69 6e  e we were lookin
3060: 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70 2e 73  g for was temp.s
3070: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20  qlite_master.   
3080: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 20   ** then change 
3090: 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71 6c 69  the name to sqli
30a0: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 61  te_temp_master a
30b0: 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f  nd try again. */
30c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
30d0: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d  StrICmp(zName, M
30e0: 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30 20 29  ASTER_NAME)!=0 )
30f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
3100: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
3110: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
3120: 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21  Db[1].zDbSName)!
3130: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
3140: 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53  zName = TEMP_MAS
3150: 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20  TER_NAME;.  }.  
3160: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3170: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3180: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3190: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
31a0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
31b0: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
31c0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
31d0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
31e0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
31f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
3200: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
3210: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
3220: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3230: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
3240: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
3250: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
3260: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
3270: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
3280: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
3290: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
32a0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
32b0: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
32c0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
32d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
32e0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
32f0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
3300: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
3310: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
3320: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
3330: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
3340: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3350: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
3360: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
3370: 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c  rors */.  u32 fl
3380: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
3390: 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45 57 20   /* LOCATE_VIEW 
33a0: 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20  or LOCATE_NOERR 
33b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
33c0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  *zName,     /* N
33d0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
33e0: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
33f0: 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  for */.  const c
3400: 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20  har *zDbase     
3410: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
3420: 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20  atabase.  Might 
3430: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
3440: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
3450: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
3460: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ->db;..  /* Read
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
3480: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
3490: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
34a0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
34b0: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
34c0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
34d0: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
34e0: 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  f( (db->mDbFlags
34f0: 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61   & DBFLAG_Schema
3500: 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20  KnownOk)==0 .   
3510: 26 26 20 21 49 73 53 68 61 72 65 64 53 63 68 65  && !IsSharedSche
3520: 6d 61 28 64 62 29 0a 20 20 20 26 26 20 53 51 4c  ma(db).   && SQL
3530: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
3540: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
3550: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
3560: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
3570: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
3580: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  (db, zName, zDba
3590: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
35a0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
35b0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
35c0: 42 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  BLE.    /* If zN
35d0: 61 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74  ame is the not t
35e0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  he name of a tab
35f0: 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  le in the schema
3600: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20   created using. 
3610: 20 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68     ** CREATE, th
3620: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
3630: 69 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d  if it is the nam
3640: 65 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20  e of an virtual 
3650: 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  table that.    *
3660: 2a 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e  * can be an epon
3670: 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
3680: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ble. */.    if( 
3690: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56  pParse->disableV
36a0: 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tab==0 ){.      
36b0: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
36c0: 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48  Module*)sqlite3H
36d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f  ashFind(&db->aMo
36e0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
36f0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
3700: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
3710: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3720: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3730: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3740: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3750: 65 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d  egister(db, zNam
3760: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3770: 20 20 69 66 28 20 70 4d 6f 64 20 29 7b 0a 20 20    if( pMod ){.  
3780: 20 20 20 20 20 20 69 66 28 20 49 73 53 68 61 72        if( IsShar
3790: 65 64 53 63 68 65 6d 61 28 64 62 29 20 26 26 20  edSchema(db) && 
37a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
37b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
37c0: 20 62 44 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20   bDummy = 0;.   
37d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
37e0: 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  c = sqlite3Schem
37f0: 61 4c 6f 61 64 28 64 62 2c 20 30 2c 20 26 62 44  aLoad(db, 0, &bD
3800: 75 6d 6d 79 2c 20 26 70 50 61 72 73 65 2d 3e 7a  ummy, &pParse->z
3810: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
3820: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
3830: 63 20 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c ) pParse->nErr
3840: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
3850: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3860: 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61  3VtabEponymousTa
3870: 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20  bleInit(pParse, 
3880: 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20  pMod) ){.       
3890: 20 20 20 54 61 62 6c 65 20 2a 70 45 70 6f 54 61     Table *pEpoTa
38a0: 62 20 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  b = pMod->pEpoTa
38b0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  b;.          ass
38c0: 65 72 74 28 20 49 73 53 68 61 72 65 64 53 63 68  ert( IsSharedSch
38d0: 65 6d 61 28 64 62 29 20 7c 7c 20 70 45 70 6f 54  ema(db) || pEpoT
38e0: 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
38f0: 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
3900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 70  );.          pEp
3910: 6f 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20  oTab->pSchema = 
3920: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
3930: 6d 61 3b 20 20 2f 2a 20 46 6f 72 20 53 48 41 52  ma;  /* For SHAR
3940: 45 44 5f 53 43 48 45 4d 41 20 6d 6f 64 65 20 2a  ED_SCHEMA mode *
3950: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
3960: 72 6e 20 70 45 70 6f 54 61 62 3b 0a 20 20 20 20  rn pEpoTab;.    
3970: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3980: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
3990: 66 28 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54  f( flags & LOCAT
39a0: 45 5f 4e 4f 45 52 52 20 29 20 72 65 74 75 72 6e  E_NOERR ) return
39b0: 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
39c0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
39d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56  .  }else if( IsV
39e0: 69 72 74 75 61 6c 28 70 29 20 26 26 20 70 50 61  irtual(p) && pPa
39f0: 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62  rse->disableVtab
3a00: 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20   ){.    p = 0;. 
3a10: 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 26   }..  if( p==0 &
3a20: 26 20 28 21 49 73 53 68 61 72 65 64 53 63 68 65  & (!IsSharedSche
3a30: 6d 61 28 64 62 29 20 7c 7c 20 70 50 61 72 73 65  ma(db) || pParse
3a40: 2d 3e 6e 45 72 72 3d 3d 30 29 20 29 7b 0a 20 20  ->nErr==0) ){.  
3a50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
3a60: 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c 4f 43  sg = flags & LOC
3a70: 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f 20 73  ATE_VIEW ? "no s
3a80: 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20  uch view" : "no 
3a90: 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20  such table";.   
3aa0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
3ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3ac0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
3ad0: 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20  : %s.%s", zMsg, 
3ae0: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
3af0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3b10: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
3b20: 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b  ", zMsg, zName);
3b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3b40: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3b50: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
3b60: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
3b70: 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  *p..**.** This i
3b80: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
3b90: 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  nd sqlite3Locate
3ba0: 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66  Table(). The dif
3bb0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a  ference between.
3bc0: 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  ** sqlite3Locate
3bd0: 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73  Table() and this
3be0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61   function is tha
3bf0: 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
3c00: 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65  restricts.** the
3c10: 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d   search to schem
3c20: 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69  a (p->pSchema) i
3c30: 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
3c40: 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79  . p->pSchema may
3c50: 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20   be.** non-NULL 
3c60: 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66  if it is part of
3c70: 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67   a view or trigg
3c80: 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e  er program defin
3c90: 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71  ition. See.** sq
3ca0: 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
3cb0: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
3cc0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
3cd0: 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
3ce0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3cf0: 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a  , .  u32 flags,.
3d00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3d10: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
3d20: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
3d40: 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61  ema==0 || p->zDa
3d50: 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69  tabase==0 );.  i
3d60: 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b  f( p->pSchema ){
3d70: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
3d80: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
3d90: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
3da0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  p->pSchema);.   
3db0: 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   zDb = pParse->d
3dc0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
3dd0: 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
3de0: 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74     zDb = p->zDat
3df0: 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74  abase;.  }.  ret
3e00: 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  urn sqlite3Locat
3e10: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66  eTable(pParse, f
3e20: 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  lags, p->zName, 
3e30: 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  zDb);.}../*.** L
3e40: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
3e50: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
3e60: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
3e70: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
3e80: 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61  dex given the na
3e90: 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  me of that index
3ea0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  .** and the name
3eb0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3ec0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
3ed0: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  he index..** Ret
3ee0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
3ef0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
3f00: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
3f10: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
3f20: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
3f30: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
3f40: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
3f50: 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75  ng index is retu
3f60: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
3f70: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
3f80: 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73  cate index names
3f90: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
3fa0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
3fb0: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
3fc0: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
3fd0: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
3fe0: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
3ff0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
4000: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64   command..*/.Ind
4010: 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49  ex *sqlite3FindI
4020: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
4030: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4040: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
4050: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
4060: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
4070: 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73    /* All mutexes
4080: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f   are required fo
4090: 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e  r schema access.
40a0: 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68    Make sure we h
40b0: 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61  old them. */.  a
40c0: 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c  ssert( zDb!=0 ||
40d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
40e0: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
40f0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
4100: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
4110: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
4120: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
4130: 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63  1 : i;  /* Searc
4140: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
4150: 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61  IN */.    Schema
4160: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
4170: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[j].pSchema;.
4180: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68      assert( pSch
4190: 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ema );.    if( z
41a0: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
41b0: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
41c0: 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29  b[j].zDbSName) )
41d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
41e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
41f0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4200: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  , j, 0) );.    p
4210: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
4220: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  nd(&pSchema->idx
4230: 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Hash, zName);.  
4240: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
4250: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
4260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
4270: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
4280: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
4290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 72 65  .void sqlite3Fre
42a0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
42b0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23  db, Index *p){.#
42c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
42d0: 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c  IT_ANALYZE.  sql
42e0: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53  ite3DeleteIndexS
42f0: 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23  amples(db, p);.#
4300: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
4310: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4320: 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b  >pPartIdxWhere);
4330: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4340: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
4350: 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c  aColExpr);.  sql
4360: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4370: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66  ->zColAff);.  if
4380: 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29  ( p->isResized )
4390: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
43a0: 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a  b, (void *)p->az
43b0: 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  Coll);.#ifdef SQ
43c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
43d0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c  3_OR_STAT4.  sql
43e0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52  ite3_free(p->aiR
43f0: 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  owEst);.#endif. 
4400: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4410: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
4420: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
4430: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
4440: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
4450: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
4460: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
4470: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
4480: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
4490: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
44a0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
44b0: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
44c0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
44d0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
44e0: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
44f0: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
4500: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
4510: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
4520: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
4530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
4540: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
4550: 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a  pIndex;.  Hash *
4560: 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74  pHash;..  assert
4570: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
4580: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
4590: 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20  , 0) );.  pHash 
45a0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
45b0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
45c0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
45d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
45e0: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
45f0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
4600: 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
4610: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
4620: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
4630: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
4640: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
4650: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
4660: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
4670: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
4680: 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
4690: 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28  ation of ALWAYS(
46a0: 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75  );  The index mu
46b0: 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73  st be on the lis
46c0: 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t of.      ** in
46d0: 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  dices. */.      
46e0: 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  p = pIndex->pTab
46f0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  le->pIndex;.    
4700: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
4710: 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d  p) && p->pNext!=
4720: 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d  pIndex ){ p = p-
4730: 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20  >pNext; }.      
4740: 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20  if( ALWAYS(p && 
4750: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
4760: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
4770: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
4780: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
4790: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
47a0: 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  FreeIndex(db, pI
47b0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
47c0: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
47d0: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
47e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  ;.}../*.** Look 
47f0: 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74  through the list
4800: 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73   of open databas
4810: 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61  e files in db->a
4820: 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61  Db[] and if.** a
4830: 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f  ny have been clo
4840: 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d  sed, remove them
4850: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20   from the list. 
4860: 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a   Reallocate the.
4870: 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72  ** db->aDb[] str
4880: 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c  ucture to a smal
4890: 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73  ler size, if pos
48a0: 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74  sible..**.** Ent
48b0: 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22  ry 0 (the "main"
48c0: 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20 65   database) and e
48d0: 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65 6d  ntry 1 (the "tem
48e0: 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20  p" database).** 
48f0: 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64  are never candid
4900: 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63  ates for being c
4910: 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69  ollapsed..*/.voi
4920: 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73  d sqlite3Collaps
4930: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 73  eDatabaseArray(s
4940: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
4950: 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
4960: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
4970: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
4980: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
4990: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
49a0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
49b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
49c0: 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62  ree(db, pDb->zDb
49d0: 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44  SName);.      pD
49e0: 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b  b->zDbSName = 0;
49f0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
4a00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
4a10: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
4a20: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
4a30: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
4a40: 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44  ++;.  }.  db->nD
4a50: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
4a60: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
4a70: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
4a80: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
4a90: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
4aa0: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
4ab0: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
4ac0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4ad0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20  (db, db->aDb);. 
4ae0: 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d     db->aDb = db-
4af0: 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a  >aDbStatic;.  }.
4b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
4b10: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
4b20: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 69 6e  e database at in
4b30: 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72  dex iDb.  Also r
4b40: 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50  eset the.** TEMP
4b50: 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65   schema.  The re
4b60: 73 65 74 20 69 73 20 64 65 66 65 72 72 65 64 20  set is deferred 
4b70: 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  if db->nSchemaLo
4b80: 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a  ck is not zero..
4b90: 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65 73 65  ** Deferred rese
4ba0: 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79  ts may be run by
4bb0: 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44   calling with iD
4bc0: 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b<0..*/.void sql
4bd0: 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65  ite3ResetOneSche
4be0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
4bf0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
4c00: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  i;.  assert( iDb
4c10: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69  <db->nDb );..  i
4c20: 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
4c30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4c40: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4c50: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
4c60: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
4c70: 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73  (db, iDb, DB_Res
4c80: 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44  etWanted);.    D
4c90: 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
4ca0: 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74   1, DB_ResetWant
4cb0: 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62  ed);.    db->mDb
4cc0: 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47  Flags &= ~DBFLAG
4cd0: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a  _SchemaKnownOk;.
4ce0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53    }.  if( db->nS
4cf0: 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  chemaLock==0 ){.
4d00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
4d10: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4d20: 20 20 20 20 69 66 28 20 44 62 48 61 73 50 72 6f      if( DbHasPro
4d30: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
4d40: 52 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a  ResetWanted) ){.
4d50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
4d60: 63 68 65 6d 61 43 6c 65 61 72 4f 72 44 69 73 63  chemaClearOrDisc
4d70: 6f 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b 0a 20  onnect(db, i);. 
4d80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
4da0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4db0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4dc0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4dd0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4de0: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4df0: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4e00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4e10: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4e20: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4e30: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4e40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4e50: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4e60: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4e70: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
4e80: 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d 28 69 3f 69  <db->nDb; i=(i?i
4e90: 2b 31 3a 32 29 29 7b 0a 20 20 20 20 44 62 20 2a  +1:2)){.    Db *
4ea0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
4eb0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
4ec0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
4ed0: 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61   if( db->nSchema
4ee0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
4ef0: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
4f00: 43 6c 65 61 72 4f 72 44 69 73 63 6f 6e 6e 65 63  ClearOrDisconnec
4f10: 74 28 64 62 2c 20 69 29 3b 0a 20 20 20 20 20 20  t(db, i);.      
4f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 44  }else{.        D
4f30: 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
4f40: 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74   i, DB_ResetWant
4f50: 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed);.      }.   
4f60: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4f70: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
4f80: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
4f90: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
4fa0: 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63 68 65  &= ~(DBFLAG_Sche
4fb0: 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c 41 47 5f  maChange|DBFLAG_
4fc0: 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a  SchemaKnownOk);.
4fd0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
4fe0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
4ff0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
5000: 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28 20 64  All(db);.  if( d
5010: 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d  b->nSchemaLock==
5020: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5030: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
5040: 41 72 72 61 79 28 64 62 29 3b 0a 20 20 7d 0a 7d  Array(db);.  }.}
5050: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5060: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
5070: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
5080: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
5090: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
50a0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
50b0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d 44  3 *db){.  db->mD
50c0: 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41  bFlags &= ~DBFLA
50d0: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
50e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
50f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
5100: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
5110: 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65  names of a table
5120: 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a   or view (the.**
5130: 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72   Table.aCol[] ar
5140: 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ray)..*/.void sq
5150: 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
5160: 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a  nNames(sqlite3 *
5170: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
5180: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
5190: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61  olumn *pCol;.  a
51a0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
51b0: 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20   );.  if( (pCol 
51c0: 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21  = pTable->aCol)!
51d0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
51e0: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
51f0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
5200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
5210: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
5220: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
5230: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5240: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
5250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
5260: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
5270: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
5280: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5290: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
52a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
52b0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
52c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
52d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
52e0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
52f0: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
5300: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
5310: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
5320: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
5330: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
5340: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
5350: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
5360: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
5370: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
5380: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
5390: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
53a0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
53b0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
53c0: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
53d0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
53e0: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
53f0: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
5400: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
5410: 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  b parameter is o
5420: 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20  ptional.  It is 
5430: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61  needed if the Ta
5440: 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  ble object .** c
5450: 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64  ontains lookasid
5460: 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c  e memory.  (Tabl
5470: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  e objects in the
5480: 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75   schema do not u
5490: 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20  se.** lookaside 
54a0: 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65  memory, but some
54b0: 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   ephemeral Table
54c0: 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f   objects do.)  O
54d0: 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61  r the.** db para
54e0: 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65  meter can be use
54f0: 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74  d with db->pnByt
5500: 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75  esFreed to measu
5510: 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re the memory.**
5520: 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62   used by the Tab
5530: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  le object..*/.st
5540: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
5550: 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65  _NOINLINE delete
5560: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
5570: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
5580: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
5590: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69 66  ex, *pNext;..#if
55a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
55b0: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
55c0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   number of outst
55d0: 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65  anding lookaside
55e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20   allocations in 
55f0: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20  schema Tables.  
5600: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ** prior to doin
5610: 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65  g any free() ope
5620: 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20  rations.  Since 
5630: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f  schema Tables do
5640: 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f   not use.  ** lo
5650: 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75  okaside, this nu
5660: 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  mber should not 
5670: 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e 74  change. */.  int
5680: 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30 3b   nLookaside = 0;
5690: 0a 20 20 69 66 28 20 64 62 20 26 26 20 28 70 54  .  if( db && (pT
56a0: 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26  able->tabFlags &
56b0: 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
56c0: 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61 73  0 ){.    nLookas
56d0: 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 6f  ide = sqlite3Loo
56e0: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 20 30  kasideUsed(db, 0
56f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
5700: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69   /* Delete all i
5710: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
5720: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
5730: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  e. */.  for(pInd
5740: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
5750: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
5760: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
5770: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
5780: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
5790: 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t( pIndex->pSche
57a0: 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68  ma==pTable->pSch
57b0: 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ema.         || 
57c0: 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c  (IsVirtual(pTabl
57d0: 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 64  e) && pIndex->id
57e0: 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
57f0: 58 54 59 50 45 5f 41 50 50 44 45 46 29 20 29 3b  XTYPE_APPDEF) );
5800: 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30 20  .    if( (db==0 
5810: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
5820: 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56 69  eed==0) && !IsVi
5830: 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 7b  rtual(pTable) ){
5840: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
5850: 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  me = pIndex->zNa
5860: 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f  me; .      TESTO
5870: 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c  NLY ( Index *pOl
5880: 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73  d = ) sqlite3Has
5890: 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20  hInsert(.       
58a0: 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65    &pIndex->pSche
58b0: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
58c0: 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  me, 0.      );. 
58d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d       assert( db=
58e0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68  =0 || sqlite3Sch
58f0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
5900: 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
5910: 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ema) );.      as
5920: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64  sert( pOld==pInd
5930: 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b  ex || pOld==0 );
5940: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5950: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
5960: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
5970: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
5980: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
5990: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
59a0: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
59b0: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
59c0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
59d0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
59e0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
59f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
5a00: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
5a10: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
5a20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5a30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
5a40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5a50: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
5a60: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
5a70: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
5a80: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
5a90: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
5aa0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
5ab0: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
5ac0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5ad0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
5ae0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
5af0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
5b00: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
5b10: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
5b20: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
5b30: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
5b40: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
5b50: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
5b60: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
5b70: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
5b80: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73 71 6c   nLookaside==sql
5b90: 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65  ite3LookasideUse
5ba0: 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76 6f 69  d(db,0) );.}.voi
5bb0: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
5bc0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
5bd0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
5be0: 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65  {.  /* Do not de
5bf0: 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75  lete the table u
5c00: 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e  ntil the referen
5c10: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
5c20: 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20   zero. */.  if( 
5c30: 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e  !pTable ) return
5c40: 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c  ;.  if( ((!db ||
5c50: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5c60: 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62  d==0) && (--pTab
5c70: 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29 20  le->nTabRef)>0) 
5c80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c 65  ) return;.  dele
5c90: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
5ca0: 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  le);.}.../*.** U
5cb0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
5cc0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
5cd0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
5ce0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
5cf0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
5d00: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
5d10: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
5d20: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
5d30: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
5d40: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5d50: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
5d60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
5d70: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
5d80: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
5d90: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
5da0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
5db0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
5dc0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
5dd0: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
5de0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
5df0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
5e00: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
5e10: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
5e20: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
5e30: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
5e40: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
5e50: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
5e60: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
5e70: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
5e80: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
5e90: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
5ea0: 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  bName, 0);.  sql
5eb0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
5ec0: 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 6d 44  db, p);.  db->mD
5ed0: 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
5ee0: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
5ef0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
5f00: 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20  token, return a 
5f10: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73  string that cons
5f20: 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74  ists of the text
5f30: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65   of that.** toke
5f40: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
5f50: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
5f60: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
5f70: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5f80: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
5f90: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
5fa0: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
5fc0: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
5fd0: 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27   (ex:  "name", '
5fe0: 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f  name', [name], o
5ff0: 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a  r `name`) that.*
6000: 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62  * surround the b
6010: 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ody of the token
6020: 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a   are removed..**
6030: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
6040: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
6050: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
6060: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
6070: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
6080: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
6090: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
60a0: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
60b0: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
60c0: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
60d0: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
60e0: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
60f0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6100: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
6110: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
6120: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
6130: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
6140: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6150: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
6160: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
6170: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
6180: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
6190: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
61a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
61b0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
61c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
61d0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
61e0: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
61f0: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
6200: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
6210: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
6220: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
6230: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
6240: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
6250: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
6260: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
6270: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
6280: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
6290: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
62a0: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
62b0: 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e 41  OT, 1, MASTER_NA
62c0: 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ME);.  sqlite3Vd
62d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
62e0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
62f0: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62  MASTER_ROOT, iDb
6300: 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  , 5);.  if( p->n
6310: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Tab==0 ){.    p-
6320: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
6330: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
6340: 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74  r zName points t
6350: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
6360: 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ed buffer contai
6370: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  ning the name.**
6380: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
6390: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f  "main", "temp" o
63a0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
63b0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
63c0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
63d0: 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65  returns the inde
63e0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
63f0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
6400: 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69  Db[], or.** -1 i
6410: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63  f the named db c
6420: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
6430: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
6440: 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33  ndDbName(sqlite3
6450: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
6460: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
6470: 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  i = -1;         
6480: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
6490: 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d  er */.  if( zNam
64a0: 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  e ){.    Db *pDb
64b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
64c0: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
64d0: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
64e0: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
64f0: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
6500: 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d 3e 7a  3_stricmp(pDb->z
6510: 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20  DbSName, zName) 
6520: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f  ) break;.      /
6530: 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c 77 61  * "main" is alwa
6540: 79 73 20 61 6e 20 61 63 63 65 70 74 61 62 6c 65  ys an acceptable
6550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 70   alias for the p
6560: 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 0a  rimary database.
6570: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66        ** even if
6580: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 65 6e   it has been ren
6590: 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c 49 54  amed using SQLIT
65a0: 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44  E_DBCONFIG_MAIND
65b0: 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20 20 20  BNAME. */.      
65c0: 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d 3d 73  if( i==0 && 0==s
65d0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22  qlite3_stricmp("
65e0: 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20 29 20  main", zName) ) 
65f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6600: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
6610: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
6620: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
6630: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
6640: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
6650: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
6660: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
6670: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
6680: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
6690: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
66a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
66b0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
66c0: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
66d0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
66e0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
66f0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
6700: 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20  3FindDb(sqlite3 
6710: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
6720: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
6750: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
6760: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
6790: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
67a0: 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20   for */.  zName 
67b0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
67c0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
67d0: 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33  );.  i = sqlite3
67e0: 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
67f0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
6800: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
6810: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
6820: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
6830: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
6840: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
6850: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6860: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
6870: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
6880: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
6890: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
68a0: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
68b0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
68c0: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
68d0: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
68e0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
68f0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
6900: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
6910: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
6920: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
6930: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
6940: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
6950: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
6960: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
6970: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
6980: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
6990: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
69a0: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
69b0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
69c0: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
69d0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
69e0: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
69f0: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
6a00: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
6a10: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
6a20: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
6a30: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
6a40: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
6a50: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
6a60: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
6a70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6a80: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
6a90: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
6aa0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
6ab0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
6ac0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
6ad0: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
6ae0: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
6af0: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
6b00: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
6b10: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
6b20: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
6b30: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
6b40: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
6b50: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
6b60: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
6b70: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
6b80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
6b90: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6ba0: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
6bb0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
6bc0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6bd0: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
6be0: 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66  Name2!=0 );.  if
6bf0: 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  ( pName2->n>0 ){
6c00: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
6c10: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
6c20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6c30: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
6c40: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
6c50: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
6c60: 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61     }.    *pUnqua
6c70: 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20  l = pName2;.    
6c80: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
6c90: 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b  dDb(db, pName1);
6ca0: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
6cb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
6cc0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6cd0: 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
6ce0: 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a  e %T", pName1);.
6cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
6d00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6d10: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
6d20: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
6d30: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
6d40: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
6d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
6d60: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
6d70: 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21   DBFLAG_Vacuum)!
6d80: 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  =0);.    iDb = d
6d90: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6da0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6db0: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
6dc0: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
6dd0: 72 75 65 20 69 66 20 50 52 41 47 4d 41 20 77 72  rue if PRAGMA wr
6de0: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 69 73  itable_schema is
6df0: 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   ON.*/.int sqlit
6e00: 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61  e3WritableSchema
6e10: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
6e20: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6e30: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6e40: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6e50: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 30 20  _Defensive))==0 
6e60: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
6e70: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6e80: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6e90: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6ea0: 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ==.             
6eb0: 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63    SQLITE_WriteSc
6ec0: 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74 63 61  hema );.  testca
6ed0: 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28  se( (db->flags&(
6ee0: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6ef0: 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73  ma|SQLITE_Defens
6f00: 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20  ive))==.        
6f10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 65         SQLITE_De
6f20: 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74 65 73  fensive );.  tes
6f30: 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67  tcase( (db->flag
6f40: 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53  s&(SQLITE_WriteS
6f50: 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66  chema|SQLITE_Def
6f60: 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20  ensive))==.     
6f70: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
6f80: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6f90: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 20  LITE_Defensive) 
6fa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 62 2d  );.  return (db-
6fb0: 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57  >flags&(SQLITE_W
6fc0: 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54  riteSchema|SQLIT
6fd0: 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 53  E_Defensive))==S
6fe0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6ff0: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  a;.}../*.** This
7000: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
7010: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
7020: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e   UTF-8 string zN
7030: 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a  ame is a legal.*
7040: 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * unqualified na
7050: 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68  me for a new sch
7060: 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c  ema object (tabl
7070: 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f  e, index, view o
7080: 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41  r.** trigger). A
7090: 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67  ll names are leg
70a0: 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20  al except those 
70b0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
70c0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73  the string.** "s
70d0: 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65  qlite_" (in uppe
70e0: 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65  r, lower or mixe
70f0: 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f  d case). This po
7100: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d  rtion of the nam
7110: 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73  espace.** is res
7120: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
7130: 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  al use..*/.int s
7140: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
7150: 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61  tName(Parse *pPa
7160: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
7170: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21  *zName){.  if( !
7180: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
7190: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
71a0: 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20  >nested==0 .    
71b0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
71c0: 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28 70  WritableSchema(p
71d0: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a 20 20  Parse->db)==0.  
71e0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
71f0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
7200: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
7210: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
7220: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7230: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
7240: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
7250: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
7260: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
7270: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
7280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7290: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
72a0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
72b0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
72c0: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
72d0: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
72e0: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
72f0: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
7300: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
7310: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
7320: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
7330: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
7340: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
7350: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7360: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
7370: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
7380: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
7390: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
73a0: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
73b0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
73c0: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
73d0: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
73e0: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
73f0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
7400: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
7410: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
7420: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
7430: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
7440: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
7450: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
7460: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
7470: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
7480: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
7490: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
74a0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
74b0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
74c0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
74d0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
74e0: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
74f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7500: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
7510: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
7520: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
7530: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
7540: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
7550: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
7560: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
7570: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
7580: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
7590: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
75a0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
75b0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
75c0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
75d0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
75e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
75f0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
7600: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
7610: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
7620: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
7630: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
7640: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
7650: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
7660: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
7670: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
7680: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
7690: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
76a0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
76b0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
76c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
76d0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
76e0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
76f0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
7700: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
7710: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
7720: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
7730: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
7740: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7750: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
7760: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
7770: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
7780: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
7790: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
77a0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
77b0: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
77c0: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
77d0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
77e0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
77f0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
7800: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
7810: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
7820: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7830: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
7840: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
7850: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
7860: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
7870: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
7880: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
7890: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
78a0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
78b0: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
78c0: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
78d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
78e0: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
78f0: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
7900: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
7910: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
7920: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
7930: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
7940: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
7950: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
7960: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
7970: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
7980: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
7990: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
79a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
79b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
79c0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
79d0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
79e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
79f0: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
7a00: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
7a10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
7a20: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
7a30: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
7a40: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
7a50: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  /..  if( db->ini
7a60: 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e  t.busy && db->in
7a70: 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b  it.newTnum==1 ){
7a80: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  .    /* Special 
7a90: 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74  case:  Parsing t
7aa0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7ab0: 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   or sqlite_temp_
7ac0: 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f  master schema */
7ad0: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
7ae0: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61  nit.iDb;.    zNa
7af0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7b00: 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f  rDup(db, SCHEMA_
7b10: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20  TABLE(iDb));.   
7b20: 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b   pName = pName1;
7b30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7b40: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
7b50: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
7b60: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
7b70: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
7b80: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
7b90: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
7ba0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
7bb0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
7bc0: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
7bd0: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
7be0: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
7bf0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
7c00: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
7c10: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
7c20: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
7c30: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
7c40: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65  base name is "te
7c50: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a  mp" anyway.  */.
7c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7c70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7c80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
7c90: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
7ca0: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  alified");.     
7cb0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7cc0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
7cd0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
7ce0: 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61  iDb = 1;.    zNa
7cf0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
7d00: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
7d10: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e  ame);.    if( IN
7d20: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
7d30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
7d40: 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
7d50: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e 61  arse, (void*)zNa
7d60: 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  me, pName);.    
7d70: 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
7d80: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
7d90: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
7da0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7db0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
7dc0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
7dd0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
7de0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
7df0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7e00: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
7e10: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
7e20: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
7e30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7e40: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
7e50: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7e60: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7e70: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
7e80: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
7e90: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
7ea0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
7eb0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
7ec0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7ed0: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7ee0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7ef0: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7f00: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
7f10: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
7f20: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7f30: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
7f40: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7f50: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7f60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7f70: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7f80: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
7f90: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
7fa0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
7fb0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7fc0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7fd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
7fe0: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
7ff0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
8000: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
8010: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
8050: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
8060: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
8070: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
8080: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
8090: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
80a0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
80b0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
80c0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
80d0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
80e0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
80f0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
8100: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
8110: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
8120: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
8130: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
8140: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
8150: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
8160: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
8170: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
8180: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
8190: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
81a0: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
81b0: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
81c0: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
81d0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
81e0: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
81f0: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
8200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
8210: 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
8220: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
8230: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
8240: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
8250: 20 21 49 73 53 68 61 72 65 64 53 63 68 65 6d 61   !IsSharedSchema
8260: 28 64 62 29 20 26 26 20 53 51 4c 49 54 45 5f 4f  (db) && SQLITE_O
8270: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
8280: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
8290: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
82a0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
82b0: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
82c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
82d0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
82e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
82f0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
8300: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
8310: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8320: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
8330: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
8340: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
8350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8360: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
8370: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
8380: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
8390: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
83a0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
83b0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
83c0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
83d0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
83e0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
83f0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
8400: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
8410: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8420: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8430: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
8440: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
8450: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
8460: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
8470: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
8480: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
8490: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
84a0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
84b0: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
84c0: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
84d0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
84e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
84f0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
8500: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
8510: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
8520: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
8530: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
8540: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
8550: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
8560: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
8570: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
8580: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
8590: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
85a0: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20  pTable->nTabRef 
85b0: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
85c0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
85d0: 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  T.  pTable->nRow
85e0: 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33  LogEst = sqlite3
85f0: 4c 6f 67 45 73 74 28 53 51 4c 49 54 45 5f 44 45  LogEst(SQLITE_DE
8600: 46 41 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23  FAULT_ROWEST);.#
8610: 65 6c 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  else.  pTable->n
8620: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
8630: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
8640: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
8650: 35 37 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  576) );.#endif. 
8660: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
8670: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
8680: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
8690: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
86a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
86b0: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
86c0: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
86d0: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
86e0: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
86f0: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
8700: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
8710: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
8720: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
8730: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
8740: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
8750: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
8760: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8770: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
8780: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
8790: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
87a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
87b0: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
87c0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
87d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
87e0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
87f0: 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c   0) );.    pTabl
8800: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  e->pSchema->pSeq
8810: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
8820: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
8830: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
8840: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
8850: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
8860: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
8870: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
8880: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
8890: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
88a0: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
88b0: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
88c0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
88d0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
88e0: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
88f0: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
8900: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
8910: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
8920: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
8930: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
8940: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
8950: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
8960: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
8970: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
8980: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
8990: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
89a0: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
89b0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
89c0: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
89d0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
89e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
89f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
8a00: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
8a10: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
8a20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
8a30: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
8a40: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
8a50: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
8a60: 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b  .    /* nullRow[
8a70: 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72  ] is an OP_Recor
8a80: 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  d encoding of a 
8a90: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35  row containing 5
8aa0: 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74   NULLs */.    st
8ab0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8ac0: 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c  nullRow[] = { 6,
8ad0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
8ae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
8af0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
8b00: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
8b10: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
8b20: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8b30: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
8b40: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
8b50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
8b60: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
8b70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8b80: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
8b90: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
8ba0: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
8bb0: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
8bc0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
8bd0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
8be0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
8bf0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
8c00: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
8c10: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
8c20: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
8c30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8c40: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
8c50: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
8c60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8c70: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
8c80: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
8c90: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
8ca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8cb0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
8cc0: 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  b);.    addr1 = 
8cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ce0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
8cf0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8d00: 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d  v);.    fileForm
8d10: 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  at = (db->flags 
8d20: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  & SQLITE_LegacyF
8d30: 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20  ileFmt)!=0 ?.   
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
8d50: 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49   : SQLITE_MAX_FI
8d60: 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73  LE_FORMAT;.    s
8d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8d80: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
8d90: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c  , iDb, BTREE_FIL
8da0: 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f  E_FORMAT, fileFo
8db0: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
8dc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8dd0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
8de0: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
8df0: 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29  CODING, ENC(db))
8e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8e10: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
8e20: 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  r1);..    /* Thi
8e30: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
8e40: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
8e50: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
8e60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
8e70: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
8e80: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
8e90: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
8ea0: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
8eb0: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
8ec0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
8ed0: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
8ee0: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
8ef0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
8f00: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
8f10: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
8f20: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
8f30: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
8f40: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
8f50: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
8f60: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
8f70: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
8f80: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
8f90: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
8fa0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
8fb0: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
8fc0: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
8fd0: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
8fe0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
8ff0: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
9000: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
9010: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
9020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
9030: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
9040: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9050: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
9060: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
9070: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
9080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9090: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
90a0: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
90b0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
90c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64       pParse->add
90d0: 72 43 72 54 61 62 20 3d 0a 20 20 20 20 20 20 20  rCrTab =.       
90e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
90f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
9100: 42 74 72 65 65 2c 20 69 44 62 2c 20 72 65 67 32  Btree, iDb, reg2
9110: 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b  , BTREE_INTKEY);
9120: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9130: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
9140: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
9150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9160: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
9170: 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a  owid, 0, reg1);.
9180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9190: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
91a0: 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75  , 6, reg3, 0, nu
91b0: 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43  llRow, P4_STATIC
91c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
91d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
91e0: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
91f0: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
9200: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
9210: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
9220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9230: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
9240: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
9250: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
9260: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
9270: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
9280: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9290: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
92a0: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
92b0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
92c0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
92d0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
92e0: 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20   Set properties 
92f0: 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  of a table colum
9300: 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28  n based on the (
9310: 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65  magical).** name
9320: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a   of the column..
9330: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
9340: 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55  ABLE_HIDDEN_COLU
9350: 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MNS.void sqlite3
9360: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
9370: 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a  FromName(Table *
9380: 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43  pTab, Column *pC
9390: 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ol){.  if( sqlit
93a0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c  e3_strnicmp(pCol
93b0: 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64  ->zName, "__hidd
93c0: 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b  en__", 10)==0 ){
93d0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
93e0: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
93f0: 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  IDDEN;.  }else i
9400: 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21  f( pTab && pCol!
9410: 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28  =pTab->aCol && (
9420: 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67  pCol[-1].colFlag
9430: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44  s & COLFLAG_HIDD
9440: 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  EN) ){.    pTab-
9450: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
9460: 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d  OOOHidden;.  }.}
9470: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
9480: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
9490: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
94a0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
94b0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
94c0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
94d0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
94e0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
94f0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
9500: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
9510: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
9520: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
9530: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
9540: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
9550: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
9560: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
9570: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
9580: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
9590: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
95a0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
95b0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
95c0: 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  Name, Token *pTy
95d0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
95e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
95f0: 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79   *z;.  char *zTy
9600: 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pe;.  Column *pC
9610: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9630: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
9640: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
9650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9660: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
9670: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
9680: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
9690: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
96a0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
96b0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
96c0: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
96d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
96e0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   z = sqlite3DbMa
96f0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d  llocRaw(db, pNam
9700: 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20  e->n + pType->n 
9710: 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  + 2);.  if( z==0
9720: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9730: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
9740: 54 20 29 20 73 71 6c 69 74 65 33 52 65 6e 61 6d  T ) sqlite3Renam
9750: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
9760: 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d  , (void*)z, pNam
9770: 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20  e);.  memcpy(z, 
9780: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
9790: 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e  >n);.  z[pName->
97a0: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
97b0: 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  3Dequote(z);.  f
97c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
97d0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
97e0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
97f0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
9800: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9810: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9820: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
9830: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
9840: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
9850: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9860: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
9870: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
9880: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
9890: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
98a0: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
98b0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
98c0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
98d0: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
98e0: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
98f0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
9900: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
9910: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9920: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
9930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
9940: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
9950: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
9960: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
9970: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
9980: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
9990: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
99a0: 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43   = z;.  sqlite3C
99b0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
99c0: 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29  romName(p, pCol)
99d0: 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d  ;. .  if( pType-
99e0: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==0 ){.    /* 
99f0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
9a00: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
9a10: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
9a20: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
9a30: 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77  .    ** 'BLOB' w
9a40: 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 73 69  ith a default si
9a50: 7a 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20 2a  ze of 4 bytes. *
9a60: 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  /.    pCol->affi
9a70: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
9a80: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c  F_BLOB;.    pCol
9a90: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66  ->szEst = 1;.#if
9aa0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9ab0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9ac0: 43 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d 73  CES.    if( 4>=s
9ad0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9ae0: 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29  ig.szSorterRef )
9af0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  {.      pCol->co
9b00: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
9b10: 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20  G_SORTERREF;.   
9b20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
9b30: 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a  e{.    zType = z
9b40: 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
9b50: 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d  30(z) + 1;.    m
9b60: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79  emcpy(zType, pTy
9b70: 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29  pe->z, pType->n)
9b80: 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70  ;.    zType[pTyp
9b90: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73  e->n] = 0;.    s
9ba0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54  qlite3Dequote(zT
9bb0: 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ype);.    pCol->
9bc0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9bd0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
9be0: 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  Type, pCol);.   
9bf0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
9c00: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
9c10: 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f  PE;.  }.  p->nCo
9c20: 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  l++;.  pParse->c
9c30: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
9c40: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
9c50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9c60: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9c70: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9c80: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9c90: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9ca0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
9cb0: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
9cc0: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
9cd0: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
9ce0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
9cf0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
9d00: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
9d10: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
9d20: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9d30: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9d40: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
9d50: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
9d60: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
9d70: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9d80: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20  lumn *pCol;.  p 
9d90: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9da0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9db0: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
9dc0: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
9dd0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
9de0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43  p->nCol-1];.  pC
9df0: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  ol->notNull = (u
9e00: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e  8)onError;.  p->
9e10: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9e20: 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a  asNotNull;..  /*
9e30: 20 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f 74   Set the uniqNot
9e40: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79  Null flag on any
9e50: 20 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69 6e   UNIQUE or PK in
9e60: 64 65 78 65 73 20 61 6c 72 65 61 64 79 20 63 72  dexes already cr
9e70: 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  eated.  ** on th
9e80: 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20  is column.  */. 
9e90: 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c   if( pCol->colFl
9ea0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e  ags & COLFLAG_UN
9eb0: 49 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64 65  IQUE ){.    Inde
9ec0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
9ed0: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9ee0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9ef0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9f00: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b  assert( pIdx->nK
9f10: 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78  eyCol==1 && pIdx
9f20: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
9f30: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
9f40: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
9f50: 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a  ]==p->nCol-1 ){.
9f60: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e          pIdx->un
9f70: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
9f80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
9fa0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
9fb0: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
9fc0: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
9fd0: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
9fe0: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
9ff0: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
a000: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
a010: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
a020: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
a030: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
a040: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
a050: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
a060: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
a070: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
a080: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
a090: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
a0a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
a0b0: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
a0c0: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
a0d0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
a0e0: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
a0f0: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
a100: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
a110: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
a120: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
a130: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
a140: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
a150: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
a160: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
a170: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
a180: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
a190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1a0: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
a1b0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a1c0: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
a1d0: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
a1e0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
a1f0: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
a200: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
a210: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
a220: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
a230: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
a240: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
a250: 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27  F_BLOB.** 'REAL'
a260: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
a270: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
a280: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
a290: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
a2a0: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
a2b0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
a2c0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
a2d0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
a2e0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
a2f0: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
a300: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
a310: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
a320: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
a330: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
a340: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f  st char *zIn, Co
a350: 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75  lumn *pCol){.  u
a360: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
a370: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
a380: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
a390: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
a3a0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   0;..  assert( z
a3b0: 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  In!=0 );.  while
a3c0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
a3d0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
a3e0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
a3f0: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
a400: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
a410: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
a420: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
a430: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
a440: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
a450: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
a460: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
a470: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
a480: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a490: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
a4a0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
a4b0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
a4c0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
a4d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a4e0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
a4f0: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
a500: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
a510: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
a520: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
a530: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
a540: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
a550: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
a560: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
a570: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
a580: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
a590: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
a5a0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
a5b0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
a5c0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
a5d0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
a5e0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
a5f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
a600: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
a610: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
a620: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
a630: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
a640: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
a650: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
a660: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
a670: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
a680: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
a690: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a6a0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
a6b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
a6c0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
a6d0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
a6e0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
a6f0: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
a700: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
a710: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
a720: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
a730: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
a740: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
a750: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
a760: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
a770: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
a780: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
a790: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
a7a0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
a7b0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
a7c0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
a7d0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
a7e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
a7f0: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
a800: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
a810: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
a820: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
a830: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
a840: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
a850: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
a860: 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73 20    /* If pCol is 
a870: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
a880: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
a890: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
a8a0: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
a8b0: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
a8c0: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
a8d0: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
a8e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20    */.  if( pCol 
a8f0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 30  ){.    int v = 0
a900: 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73  ;   /* default s
a910: 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20  ize is approx 4 
a920: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28  bytes */.    if(
a930: 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f   aff<SQLITE_AFF_
a940: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
a950: 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20   if( zChar ){.  
a960: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68        while( zCh
a970: 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ar[0] ){.       
a980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
a990: 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20  digit(zChar[0]) 
a9a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
a9b0: 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48  * BLOB(k), VARCH
a9c0: 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d  AR(k), CHAR(k) -
a9d0: 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20  > r=(k/4+1) */. 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a9f0: 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72  e3GetInt32(zChar
aa00: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
aa10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aa20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
aa30: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
aa40: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
aa50: 20 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b 20          v = 16; 
aa60: 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c    /* BLOB, TEXT,
aa70: 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61   CLOB -> r=5  (a
aa80: 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a  pprox 20 bytes)*
aa90: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
aaa0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
aab0: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
aac0: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 76  RENCES.    if( v
aad0: 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  >=sqlite3GlobalC
aae0: 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65  onfig.szSorterRe
aaf0: 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  f ){.      pCol-
ab00: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
ab10: 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a  FLAG_SORTERREF;.
ab20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ab30: 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20   v = v/4 + 1;.  
ab40: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
ab50: 3d 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d  = 255;.    pCol-
ab60: 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a  >szEst = v;.  }.
ab70: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
ab80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
ab90: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
aba0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
abb0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
abc0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
abd0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
abe0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
abf0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
ac00: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
ac10: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
ac20: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
ac30: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
ac40: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
ac50: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
ac60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ac70: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
ac80: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
ac90: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
aca0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
acb0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
acc0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
acd0: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
ace0: 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lue(.  Parse *pP
acf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
ad00: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ad10: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
ad20: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
ad30: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 65   /* The parsed e
ad40: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
ad50: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   default value *
ad60: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ad70: 7a 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a 20  zStart,      /* 
ad80: 53 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 66  Start of the def
ad90: 61 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74 20  ault value text 
ada0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
adb0: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f 2a  *zEnd         /*
adc0: 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65 72   First character
add0: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65 66   past end of def
ade0: 61 75 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a  aut value text *
adf0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
ae00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
ae10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ae20: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
ae30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
ae40: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30  able;.  if( p!=0
ae50: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
ae60: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
ae70: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
ae80: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ae90: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
aea0: 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62  Expr, db->init.b
aeb0: 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  usy) ){.      sq
aec0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
aed0: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
aee0: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
aef0: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
af00: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
af10: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
af20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
af30: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70  * A copy of pExp
af40: 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  r is used instea
af50: 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d of the origina
af60: 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74  l, as pExpr cont
af70: 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ains.      ** to
af80: 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20  kens that point 
af90: 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f  to volatile memo
afa0: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
afb0: 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20     Expr x;.     
afc0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
afd0: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
afe0: 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lt);.      memse
aff0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
b000: 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20  x));.      x.op 
b010: 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20  = TK_SPAN;.     
b020: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71   x.u.zToken = sq
b030: 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64  lite3DbSpanDup(d
b040: 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29  b, zStart, zEnd)
b050: 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20  ;.      x.pLeft 
b060: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78  = pExpr;.      x
b070: 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70  .flags = EP_Skip
b080: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44  ;.      pCol->pD
b090: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  flt = sqlite3Exp
b0a0: 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50  rDup(db, &x, EXP
b0b0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
b0c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b0d0: 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e  e(db, x.u.zToken
b0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
b0f0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
b100: 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
b110: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
b120: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
b130: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
b140: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
b150: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  xpr);.}../*.** B
b160: 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69  ackwards Compati
b170: 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20  bility Hack:.** 
b180: 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76  .** Historical v
b190: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
b1a0: 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e  e accepted strin
b1b0: 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  gs as column nam
b1c0: 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73  es in.** indexes
b1d0: 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59   and PRIMARY KEY
b1e0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64   constraints and
b1f0: 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   in UNIQUE const
b200: 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65  raints.  Example
b210: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
b220: 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62  TE TABLE xyz(a,b
b230: 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b  ,c,d,e,PRIMARY K
b240: 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27  EY('a'),UNIQUE('
b250: 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74  b','c' COLLATE t
b260: 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41  rim).**     CREA
b270: 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20  TE INDEX abc ON 
b280: 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43  xyz('c','d' DESC
b290: 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  ,'e' COLLATE noc
b2a0: 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a  ase DESC);.**.**
b2b0: 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20   This is goofy. 
b2c0: 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65   But to preserve
b2d0: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
b2e0: 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74  tibility we cont
b2f0: 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70  inue to.** accep
b300: 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  t it.  This rout
b310: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63  ine does the nec
b320: 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f  essary conversio
b330: 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a  n.  It converts.
b340: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
b350: 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61  n given in its a
b360: 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54  rgument from a T
b370: 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20  K_STRING into a 
b380: 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20  TK_ID.** if the 
b390: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75  expression is ju
b3a0: 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77  st a TK_STRING w
b3b0: 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ith an optional 
b3c0: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a  COLLATE clause..
b3d0: 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65 73  ** If the epxres
b3e0: 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67  sion is anything
b3f0: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53   other than TK_S
b400: 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65  TRING, the expre
b410: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68  ssion is.** unch
b420: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
b430: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72   void sqlite3Str
b440: 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29  ingToId(Expr *p)
b450: 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  {.  if( p->op==T
b460: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
b470: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  p->op = TK_ID;. 
b480: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
b490: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
b4a0: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
b4b0: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70  _STRING ){.    p
b4c0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b  ->pLeft->op = TK
b4d0: 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _ID;.  }.}../*.*
b4e0: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
b4f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
b500: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
b510: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
b520: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
b530: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
b540: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
b550: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
b560: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
b570: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
b580: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
b590: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
b5a0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
b5b0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
b5c0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
b5d0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
b5e0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
b5f0: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
b600: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
b610: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
b620: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
b630: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
b640: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
b650: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
b660: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
b670: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
b680: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
b690: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
b6a0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
b6b0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
b6c0: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
b6d0: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
b6e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
b6f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
b700: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
b710: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
b720: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
b730: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
b740: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
b750: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
b760: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
b770: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
b780: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
b790: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
b7a0: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
b7b0: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
b7c0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
b7d0: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
b7e0: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
b7f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
b800: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b810: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
b820: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b830: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b840: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
b850: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
b860: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
b870: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
b880: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
b890: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
b8a0: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
b8b0: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
b8c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
b8d0: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
b8e0: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
b8f0: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
b900: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
b910: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
b920: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
b930: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
b940: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
b950: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
b960: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f  >pNewTable;.  Co
b970: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
b980: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
b990: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   i;.  int nTerm;
b9a0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
b9b0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
b9c0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
b9d0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
b9e0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
b9f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
ba00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
ba10: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
ba20: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
ba30: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
ba40: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
ba50: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
ba60: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
ba70: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
ba80: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
ba90: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
baa0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
bab0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
bac0: 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   1;.    pCol = &
bad0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bae0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
baf0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
bb00: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65  PRIMKEY;.    nTe
bb10: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
bb20: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
bb30: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
bb40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
bb50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
bb60: 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69  r *pCExpr = sqli
bb70: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
bb80: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
bb90: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73  Expr);.      ass
bba0: 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29  ert( pCExpr!=0 )
bbb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
bbc0: 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72  tringToId(pCExpr
bbd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45  );.      if( pCE
bbe0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
bbf0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
bc00: 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70  char *zCName = p
bc10: 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  CExpr->u.zToken;
bc20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
bc30: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
bc40: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
bc50: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
bc60: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61  ite3StrICmp(zCNa
bc70: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
bc80: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
bc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
bca0: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
bcb0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
bcc0: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
bcd0: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
bce0: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
bcf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
bd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bd20: 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31  }.  if( nTerm==1
bd30: 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26  .   && pCol.   &
bd40: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
bd50: 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79  (sqlite3ColumnTy
bd60: 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e  pe(pCol,""), "IN
bd70: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26  TEGER")==0.   &&
bd80: 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49   sortOrder!=SQLI
bd90: 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a  TE_SO_DESC.  ){.
bda0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
bdb0: 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73  E_OBJECT && pLis
bdc0: 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
bdd0: 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *pCExpr = sqlite
bde0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
bdf0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  (pList->a[0].pEx
be00: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
be10: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
be20: 61 70 28 70 50 61 72 73 65 2c 20 26 70 54 61 62  ap(pParse, &pTab
be30: 2d 3e 69 50 4b 65 79 2c 20 70 43 45 78 70 72 29  ->iPKey, pCExpr)
be40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
be50: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
be60: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
be70: 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  f = (u8)onError;
be80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74  .    assert( aut
be90: 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49  oInc==0 || autoI
bea0: 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  nc==1 );.    pTa
beb0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61  b->tabFlags |= a
bec0: 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e  utoInc*TF_Autoin
bed0: 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28  crement;.    if(
bee0: 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d   pList ) pParse-
bef0: 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20  >iPkSortOrder = 
bf00: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
bf10: 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69  Order;.  }else i
bf20: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
bf30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bf40: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
bf50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bf60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
bf70: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
bf80: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
bf90: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
bfa0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
bfb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
bfc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
bfd0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
bfe0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
bff0: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20   onError, 0,.   
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f          0, sortO
c020: 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f  rder, 0, SQLITE_
c030: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
c040: 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  EY);.    pList =
c050: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
c060: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
c070: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
c080: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
c090: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
c0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
c0b0: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
c0c0: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
c0d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
c0e0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
c0f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
c100: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
c110: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c120: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
c130: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c140: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
c150: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
c160: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
c170: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c180: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
c190: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
c1a0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71  >pNewTable;.  sq
c1b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c1c0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54  se->db;.  if( pT
c1d0: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
c1e0: 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71  E_VTAB.   && !sq
c1f0: 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
c200: 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d  only(db->aDb[db-
c210: 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a  >init.iDb].pBt).
c220: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70    ){.    pTab->p
c230: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
c240: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
c250: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
c260: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
c270: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
c280: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
c290: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
c2a0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
c2b0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
c2c0: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
c2d0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
c2e0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
c2f0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
c300: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c310: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
c320: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
c330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c340: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
c350: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
c360: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
c370: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
c380: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
c390: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
c3a0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
c3b0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
c3c0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
c3d0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
c3e0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
c3f0: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
c400: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
c410: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
c420: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
c430: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
c440: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
c450: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
c460: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
c470: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
c480: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c490: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
c4a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
c4b0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
c4c0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
c4d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
c4e0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
c4f0: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
c500: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
c510: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c520: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e(db, p->aCol[i]
c530: 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  .zColl);.    p->
c540: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
c550: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
c560: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
c570: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
c580: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
c590: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
c5a0: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
c5b0: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
c5c0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
c5d0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
c5e0: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
c5f0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
c600: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
c610: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
c620: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
c630: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
c640: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
c650: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
c660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c670: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
c680: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
c690: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
c6a0: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
c6b0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
c6c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
c6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c6e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
c6f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
c700: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
c710: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c720: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
c730: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c740: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
c750: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
c760: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
c770: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
c780: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
c790: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
c7a0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
c7b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
c7c0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
c7d0: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
c7e0: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
c7f0: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
c800: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
c810: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
c820: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
c830: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
c840: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
c850: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
c860: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
c870: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
c880: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
c890: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
c8a0: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
c8b0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
c8c0: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
c8d0: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
c8e0: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
c8f0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
c900: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
c910: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
c920: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
c930: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
c940: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
c950: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
c960: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
c970: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c980: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
c990: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
c9a0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
c9b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
c9c0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
c9d0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
c9e0: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
c9f0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
ca00: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
ca10: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
ca20: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
ca30: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
ca40: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
ca50: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
ca60: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
ca70: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
ca80: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
ca90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
caa0: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
cab0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cac0: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
cad0: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
cae0: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
caf0: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
cb00: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
cb10: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
cb20: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
cb30: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
cb40: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
cb50: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
cb60: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
cb70: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
cb80: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
cb90: 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20  se, enc, pColl, 
cba0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  zName);.  }..  r
cbb0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
cbc0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
cbd0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
cbe0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
cbf0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
cc00: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
cc10: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
cc20: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
cc30: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
cc40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
cc50: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
cc60: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
cc70: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
cc80: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
cc90: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
cca0: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
ccb0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
ccc0: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
ccd0: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
cce0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
ccf0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
cd00: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
cd10: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
cd20: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
cd30: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
cd40: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
cd50: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
cd60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
cd70: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
cd80: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
cd90: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
cda0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
cdb0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
cdc0: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
cdd0: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
cde0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
cdf0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
ce00: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
ce10: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
ce20: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
ce30: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
ce40: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
ce50: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
ce60: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
ce70: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
ce80: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
ce90: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
cea0: 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d  ION-OF: R-34230-
ceb0: 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75 74  56049 SQLite aut
cec0: 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65  omatically incre
ced0: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68  ments.** the sch
cee0: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e  ema-version when
cef0: 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61 20  ever the schema 
cf00: 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  changes..*/.void
cf10: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
cf20: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
cf30: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
cf40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cf50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
cf60: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
cf70: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
cf80: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
cf90: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
cfa0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
cfb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
cfc0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
cfd0: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
cfe0: 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ION, .          
cff0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 31           (int)(1
d000: 2b 28 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61  +(unsigned)db->a
d010: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
d020: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29  >schema_cookie))
d030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
d040: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
d050: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
d060: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
d070: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
d080: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
d090: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
d0a0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
d0b0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
d0c0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
d0d0: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
d0e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
d0f0: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
d100: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
d110: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
d120: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
d130: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
d140: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
d150: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
d160: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
d170: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
d180: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
d190: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
d1a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
d1b0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
d1c0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
d1d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
d1e0: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
d1f0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
d200: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
d210: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
d220: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
d230: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
d240: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
d250: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
d260: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
d270: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
d280: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
d290: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
d2a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
d2b0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
d2c0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
d2d0: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
d2e0: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
d2f0: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
d300: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
d310: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
d320: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
d330: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
d340: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
d350: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
d360: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
d370: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
d380: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
d390: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
d3a0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
d3b0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
d3c0: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
d3d0: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
d3e0: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
d3f0: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
d400: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
d410: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
d420: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
d430: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
d440: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
d450: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
d460: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
d470: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
d480: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
d490: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
d4a0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
d4b0: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
d4c0: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
d4d0: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
d4e0: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
d4f0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
d500: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
d510: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
d520: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
d530: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
d540: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
d550: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
d560: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
d570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
d580: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
d590: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
d5a0: 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  K_ID.           
d5b0: 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   || zIdent[j]!=0
d5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
d5d0: 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65  j==0;..  if( nee
d5e0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
d5f0: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
d600: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
d610: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
d620: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
d630: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
d640: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
d650: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
d660: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
d670: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
d680: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
d690: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d6a0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
d6b0: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
d6c0: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
d6d0: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
d6e0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
d6f0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
d700: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
d710: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
d720: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
d730: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
d740: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
d750: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
d760: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
d770: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
d780: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
d790: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
d7a0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
d7b0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
d7c0: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
d7d0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
d7e0: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
d7f0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
d800: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
d810: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
d820: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
d830: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
d840: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
d850: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
d860: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
d870: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
d880: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
d890: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
d8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
d8b0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
d8c0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
d8d0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
d8e0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
d8f0: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
d900: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
d910: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
d920: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
d930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
d940: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
d950: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
d960: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d970: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
d980: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
d990: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d9a0: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
d9b0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
d9c0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
d9d0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
d9e0: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
d9f0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
da00: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
da10: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
da20: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
da30: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
da40: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
da50: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
da60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
da70: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
da80: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
da90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
daa0: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
dab0: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
dac0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
dad0: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
dae0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
daf0: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
db00: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
db10: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
db20: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
db30: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
db40: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
db50: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
db60: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
db70: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
db80: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
db90: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
dba0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
dbb0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
dbc0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
dbd0: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
dbe0: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
dbf0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
dc00: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
dc10: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
dc20: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
dc30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
dc40: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
dc50: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
dc60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
dc70: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
dc80: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
dc90: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
dca0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
dcb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
dcc0: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
dcd0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
dce0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
dcf0: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
dd00: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
dd10: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
dd20: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
dd30: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
dd40: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
dd50: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
dd60: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
dd70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
dd80: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
dd90: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
dda0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
ddb0: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
ddc0: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
ddd0: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
dde0: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
ddf0: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
de00: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
de10: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
de20: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
de30: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
de40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
de50: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
de60: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
de70: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
de80: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
de90: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
dea0: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
deb0: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
dec0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
ded0: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
dee0: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
def0: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
df00: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
df10: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
df20: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
df30: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
df40: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
df50: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
df60: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
df70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
df80: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
df90: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
dfa0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
dfb0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
dfc0: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
dfd0: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
dfe0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
dff0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
e000: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
e010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e020: 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70  EM_BKPT;.  memcp
e030: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
e040: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
e050: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
e060: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
e070: 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
e080: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
e090: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
e0a0: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
e0b0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
e0c0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
e0d0: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
e0e0: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
e0f0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
e100: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
e110: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
e120: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
e130: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
e140: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
e150: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
e160: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
e170: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
e180: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
e190: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
e1a0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
e1b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e1c0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
e1d0: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
e1e0: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
e1f0: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
e200: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
e210: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
e220: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
e230: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
e240: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
e250: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
e260: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
e270: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
e280: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
e290: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
e2a0: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
e2b0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
e2c0: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
e2d0: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
e2e0: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
e2f0: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
e300: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
e310: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
e320: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
e330: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
e340: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
e350: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
e360: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
e370: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
e380: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
e390: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
e3a0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
e3b0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
e3c0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
e3d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
e3e0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
e3f0: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
e400: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
e410: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
e420: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
e430: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
e440: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
e450: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
e460: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
e470: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
e480: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
e490: 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73  ue if value x is
e4a0: 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68   found any of th
e4b0: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
e4c0: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a  ries of aiCol[].
e4d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
e4e0: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
e4f0: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
e500: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
e510: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
e520: 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c  ) if( x==*(aiCol
e530: 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ++) ) return 1;.
e540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
e550: 2a 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20  * Recompute the 
e560: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 66 69 65 6c  colNotIdxed fiel
e570: 64 20 6f 66 20 74 68 65 20 49 6e 64 65 78 2e 0a  d of the Index..
e580: 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65  **.** colNotIdxe
e590: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  d is a bitmask t
e5a0: 68 61 74 20 68 61 73 20 61 20 30 20 62 69 74 20  hat has a 0 bit 
e5b0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 65 61 63  representing eac
e5c0: 68 20 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c  h indexed.** col
e5d0: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 77 69  umns that are wi
e5e0: 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 36  thin the first 6
e5f0: 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  3 columns of the
e600: 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20   table.  The.** 
e610: 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f  high-order bit o
e620: 66 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73  f colNotIdxed is
e630: 20 61 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c 20   always 1.  All 
e640: 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  unindexed column
e650: 73 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  s.** of the tabl
e660: 65 20 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a  e have a 1..**.*
e670: 2a 20 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65  * The colNotIdxe
e680: 64 20 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64  d mask is AND-ed
e690: 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
e6a0: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61  t.a[].colUsed ma
e6b0: 73 6b 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  sk.** to determi
e6c0: 6e 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ne if the index 
e6d0: 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
e6e0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
e6f0: 64 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d  d recomputeColum
e700: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64  nsNotIndexed(Ind
e710: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
e720: 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
e730: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
e740: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
e750: 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
e760: 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
e770: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
e780: 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
e790: 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
e7a0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
e7b0: 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
e7c0: 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
e7d0: 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
e7e0: 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
e7f0: 20 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64    pIdx->colNotId
e800: 78 65 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65  xed = ~m;.  asse
e810: 72 74 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f  rt( (pIdx->colNo
e820: 74 49 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29  tIdxed>>63)==1 )
e830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e840: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20  routine runs at 
e850: 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69  the end of parsi
e860: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
e870: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
e880: 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55  .** has a WITHOU
e890: 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20  T ROWID clause. 
e8a0: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
e8b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63   routine is to c
e8c0: 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69  onvert both.** i
e8d0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
e8e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
e8f0: 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  nd the generated
e900: 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68   VDBE code so th
e910: 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61  at they.** are a
e920: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61  ppropriate for a
e930: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
e940: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
e950: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a  a rowid table..*
e960: 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64  * Changes includ
e970: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
e980: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
e990: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
e9a0: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
e9b0: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
e9c0: 4c 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43  L..**     (2)  C
e9d0: 6f 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d 65  onvert P3 parame
e9e0: 74 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72  ter of the OP_Cr
e9f0: 65 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42  eateBtree from B
ea00: 54 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20  TREE_INTKEY .** 
ea10: 20 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54           into BT
ea20: 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20  REE_BLOBKEY..** 
ea30: 20 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20      (3)  Bypass 
ea40: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
ea50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
ea60: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a  r table entry.**
ea70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68            for th
ea80: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73  e PRIMARY KEY as
ea90: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
eaa0: 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a   index is now.**
eab0: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
eac0: 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  fied by the sqli
ead0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
eae0: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
eaf0: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20  le itself..**   
eb00: 20 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49    (4)  Set the I
eb10: 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65  ndex.tnum of the
eb20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
eb30: 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ex object in the
eb40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68  .**          sch
eb50: 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70  ema to the rootp
eb60: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  age from the mai
eb70: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  n table..**     
eb80: 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62  (5)  Add all tab
eb90: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
eba0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
ebb0: 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20  dex object.**   
ebc0: 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74         so that t
ebd0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
ebe0: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
ebf0: 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73  ex.  The surplus
ec00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .**          col
ec10: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
ec20: 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65   KeyInfo.nAllFie
ec30: 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75  ld and are not u
ec40: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  sed for.**      
ec50: 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c      sorting or l
ec60: 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e  ookup or uniquen
ec70: 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20  ess checks..**  
ec80: 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20     (6)  Replace 
ec90: 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f  the rowid tail o
eca0: 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61  n all automatica
ecb0: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e  lly generated UN
ecc0: 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  IQUE.**         
ecd0: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68   indices with th
ece0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
ecf0: 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  lumns..**.** For
ed00: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c   virtual tables,
ed10: 20 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72   only (1) is per
ed20: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
ed30: 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f  c void convertTo
ed40: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
ed50: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
ed60: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
ed70: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
ed80: 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e  Index *pPk;.  in
ed90: 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20  t nPk;.  int i, 
eda0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
edb0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
edc0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
edd0: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20  e->pVdbe;..  /* 
ede0: 4d 61 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41  Mark every PRIMA
edf0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73  RY KEY column as
ee00: 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70   NOT NULL (excep
ee10: 74 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74  t for imposter t
ee20: 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66  ables).  */.  if
ee30: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f  ( !db->init.impo
ee40: 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20  sterTable ){.   
ee50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
ee60: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
ee70: 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61      if( (pTab->a
ee80: 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20  Col[i].colFlags 
ee90: 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
eea0: 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
eeb0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e   pTab->aCol[i].n
eec0: 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72  otNull = OE_Abor
eed0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
eee0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
eef0: 72 74 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  rt the P3 operan
ef00: 64 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61  d of the OP_Crea
ef10: 74 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20 66  teBtree opcode f
ef20: 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  rom BTREE_INTKEY
ef30: 0a 20 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45  .  ** into BTREE
ef40: 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20  _BLOBKEY..  */. 
ef50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
ef60: 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73  rCrTab ){.    as
ef70: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73  sert( v );.    s
ef80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ef90: 50 33 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64  P3(v, pParse->ad
efa0: 64 72 43 72 54 61 62 2c 20 42 54 52 45 45 5f 42  drCrTab, BTREE_B
efb0: 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20  LOBKEY);.  }..  
efc0: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
efd0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
efe0: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
eff0: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
f000: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
f010: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
f020: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
f030: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
f040: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
f050: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
f060: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
f070: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b   *pList;.    Tok
f080: 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20  en ipkToken;.   
f090: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
f0a0: 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61  t(&ipkToken, pTa
f0b0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
f0c0: 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
f0d0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
f0e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
f0f0: 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20  Parse, 0, .     
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f110: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
f120: 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b  , TK_ID, &ipkTok
f130: 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  en, 0));.    if(
f140: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
f150: 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  rn;.    pList->a
f160: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
f170: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
f180: 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rder;.    assert
f190: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
f1a0: 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
f1b0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
f1c0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
f1d0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62  , 0, pList, pTab
f1e0: 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c  ->keyConf, 0, 0,
f1f0: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
f210: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
f220: 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66  MARYKEY);.    if
f230: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f240: 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
f250: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rr ) return;.   
f260: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
f270: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
f280: 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  ab);.    pTab->i
f290: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  PKey = -1;.  }el
f2a0: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
f2b0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
f2c0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
f2d0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
f2e0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
f2f0: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75   Remove all redu
f300: 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72  ndant columns fr
f310: 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  om the PRIMARY K
f320: 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  EY.  For example
f330: 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  , change.    ** 
f340: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
f350: 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69  ,a,b,c,b,c,d)" i
f360: 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52  nto just "PRIMAR
f370: 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e  Y KEY(a,b,c,d)".
f380: 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63    Later.    ** c
f390: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20  ode assumes the 
f3a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74  PRIMARY KEY cont
f3b0: 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64  ains no repeated
f3c0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f   columns..    */
f3d0: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20  .    for(i=j=1; 
f3e0: 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  i<pPk->nKeyCol; 
f3f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f400: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
f410: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d  iColumn, j, pPk-
f420: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
f430: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43  .        pPk->nC
f440: 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d  olumn--;.      }
f450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
f460: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d  k->aiColumn[j++]
f470: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
f480: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
f490: 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79   }.    pPk->nKey
f4a0: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61  Col = j;.  }.  a
f4b0: 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b  ssert( pPk!=0 );
f4c0: 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69  .  pPk->isCoveri
f4d0: 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64  ng = 1;.  if( !d
f4e0: 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
f4f0: 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69  Table ) pPk->uni
f500: 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  qNotNull = 1;.  
f510: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
f520: 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73  ol;..  /* Bypass
f530: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
f540: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f550: 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
f560: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
f570: 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54  * table entry. T
f580: 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  his is only requ
f590: 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c  ired if currentl
f5a0: 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42  y generating VDB
f5b0: 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20  E.  ** code for 
f5c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28  a CREATE TABLE (
f5d0: 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67  not when parsing
f5e0: 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20   one as part of 
f5f0: 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64  reading.  ** a d
f600: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e  atabase schema).
f610: 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20    */.  if( v && 
f620: 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20  pPk->tnum>0 ){. 
f630: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
f640: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
f650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f660: 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50  angeOpcode(v, pP
f670: 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f  k->tnum, OP_Goto
f680: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
f690: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
f6a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
f6b0: 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20   the table root 
f6c0: 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74  page */.  pPk->t
f6d0: 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  num = pTab->tnum
f6e0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
f6f0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
f700: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
f710: 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
f720: 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
f730: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
f740: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
f750: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
f760: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
f770: 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
f780: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
f790: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f7a0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
f7b0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
f7c0: 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  f( IsPrimaryKeyI
f7d0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
f7e0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
f7f0: 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
f800: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
f810: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
f820: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
f830: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
f840: 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a  lumn[i]) ) n++;.
f850: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d      }.    if( n=
f860: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
f870: 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73  his index is a s
f880: 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70  uperset of the p
f890: 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
f8a0: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
f8b0: 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  n = pIdx->nKeyCo
f8c0: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
f8d0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
f8e0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
f8f0: 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64  ct(db, pIdx, pId
f900: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20  x->nKeyCol+n) ) 
f910: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
f920: 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65  i=0, j=pIdx->nKe
f930: 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  yCol; i<nPk; i++
f940: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
f950: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
f960: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
f970: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
f980: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
f990: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
f9a0: 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  mn[j] = pPk->aiC
f9b0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
f9c0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a    pIdx->azColl[j
f9d0: 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
f9e0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  i];.        j++;
f9f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fa00: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
fa10: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e  >nColumn>=pIdx->
fa20: 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20  nKeyCol+n );.   
fa30: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
fa40: 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d  Column>=j );.  }
fa50: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74  ..  /* Add all t
fa60: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
fa70: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
fa80: 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28  index.  */.  if(
fa90: 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20   nPk<pTab->nCol 
faa0: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a  ){.    if( resiz
fab0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
fac0: 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c   pPk, pTab->nCol
fad0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
fae0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20  for(i=0, j=nPk; 
faf0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
fb00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
fb10: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
fb20: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b  Column, j, i) ){
fb30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fb40: 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20   j<pPk->nColumn 
fb50: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  );.        pPk->
fb60: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b  aiColumn[j] = i;
fb70: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a  .        pPk->az
fb80: 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65  Coll[j] = sqlite
fb90: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
fba0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
fbb0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
fbc0: 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d  t( pPk->nColumn=
fbd0: 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =j );.    assert
fbe0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20  ( pTab->nCol==j 
fbf0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fc00: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  pPk->nColumn = p
fc10: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  Tab->nCol;.  }. 
fc20: 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   recomputeColumn
fc30: 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29  sNotIndexed(pPk)
fc40: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
fc50: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
fc60: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TABLE./*.** Retu
fc70: 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61 6d 65  rn true if zName
fc80: 20 69 73 20 61 20 73 68 61 64 6f 77 20 74 61 62   is a shadow tab
fc90: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 63  le name in the c
fca0: 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 0a  urrent database.
fcb0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
fcc0: 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65  *.** zName is te
fcd0: 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66 69  mporarily modifi
fce0: 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f  ed while this ro
fcf0: 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67  utine is running
fd00: 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65 73 74  , but is.** rest
fd10: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
fd20: 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69 6f 72  inal value prior
fd30: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
fd40: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
fd50: 74 61 74 69 63 20 69 6e 74 20 69 73 53 68 61 64  tatic int isShad
fd60: 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69  owTableName(sqli
fd70: 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a  te3 *db, char *z
fd80: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
fd90: 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Tail;           
fda0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
fdb0: 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 22 5f  r to the last "_
fdc0: 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  " in zName */.  
fdd0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fdf0: 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d   Table that zNam
fe00: 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 6f 66  e is a shadow of
fe10: 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d   */.  Module *pM
fe20: 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  od;             
fe30: 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f      /* Module fo
fe40: 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
fe50: 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20  ble */..  zTail 
fe60: 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d 65 2c  = strrchr(zName,
fe70: 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54 61   '_');.  if( zTa
fe80: 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  il==0 ) return 0
fe90: 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  ;.  *zTail = 0;.
fea0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
feb0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
fec0: 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61 69  ame, 0);.  *zTai
fed0: 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20 70  l = '_';.  if( p
fee0: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
fef0: 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69 72 74  0;.  if( !IsVirt
ff00: 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
ff10: 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20 28  rn 0;.  pMod = (
ff20: 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48  Module*)sqlite3H
ff30: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f  ashFind(&db->aMo
ff40: 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f  dule, pTab->azMo
ff50: 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20 69  duleArg[0]);.  i
ff60: 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65 74  f( pMod==0 ) ret
ff70: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f  urn 0;.  if( pMo
ff80: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65 72  d->pModule->iVer
ff90: 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e 20  sion<3 ) return 
ffa0: 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  0;.  if( pMod->p
ffb0: 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e  Module->xShadowN
ffc0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
ffd0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f 64  0;.  return pMod
ffe0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64  ->pModule->xShad
fff0: 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b  owName(zTail+1);
10000 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
10010 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  e isShadowTableN
10020 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  ame(x,y) 0.#endi
10030 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
10040 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10050 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ABLE */../*.** T
10060 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10070 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
10080 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
10090 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
100a0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
100b0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
100c0 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
100d0 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
100e0 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
100f0 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
10100 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
10110 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
10120 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
10130 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
10140 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
10150 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
10160 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
10170 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
10180 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
10190 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
101a0 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
101b0 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
101c0 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
101d0 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
101e0 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
101f0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
10200 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
10210 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
10220 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
10230 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
10240 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
10250 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
10260 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
10270 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
10280 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
10290 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
102a0 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
102b0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
102c0 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
102d0 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
102e0 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
102f0 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
10300 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
10310 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
10320 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
10330 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
10340 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
10350 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
10360 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
10370 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
10380 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
10390 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
103a0 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
103b0 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
103c0 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
103d0 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
103e0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
103f0 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
10400 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10410 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
10420 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
10430 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
10440 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
10450 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
10460 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
10470 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
10480 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
10490 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20   The ')' before 
104a0 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43  options in the C
104b0 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
104c0 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20   u8 tabOpts,    
104d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
104e0 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e  a table options.
104f0 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20   Usually 0. */. 
10500 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10510 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
10520 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
10530 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
10540 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
10550 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
10560 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
10570 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
10580 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10590 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
105a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
105b0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105d0 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63  Database in whic
105e0 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65  h the table live
105f0 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
10600 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
10610 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69   /* An implied i
10620 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
10630 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64  e */..  if( pEnd
10640 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
10650 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
10660 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
10670 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10680 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
10690 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
106a0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
106b0 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
106c0 3d 3d 30 20 26 26 20 69 73 53 68 61 64 6f 77 54  ==0 && isShadowT
106d0 61 62 6c 65 4e 61 6d 65 28 64 62 2c 20 70 2d 3e  ableName(db, p->
106e0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 70 2d  zName) ){.    p-
106f0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
10700 53 68 61 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  Shadow;.  }..  /
10710 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
10720 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
10730 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
10740 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
10750 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
10760 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
10770 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
10780 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
10790 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
107a0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
107b0 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
107c0 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
107d0 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
107e0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
107f0 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
10800 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
10810 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
10820 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
10830 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
10840 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
10850 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
10860 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
10870 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
10880 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 1, that means
10890 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71 6c   this is the sql
108a0 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
108b0 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53  table itself.  S
108c0 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f  o mark it read-o
108d0 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nly..  */.  if( 
108e0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
108f0 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
10900 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10910 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10920 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
10930 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
10940 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
10950 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69  t.newTnum;.    i
10960 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20  f( p->tnum==1 ) 
10970 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
10980 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a  F_Readonly;.  }.
10990 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 74  .  assert( (p->t
109a0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
109b0 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 0a 20  PrimaryKey)==0. 
109c0 20 20 20 20 20 20 7c 7c 20 70 2d 3e 69 50 4b 65        || p->iPKe
109d0 79 3e 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  y>=0 || sqlite3P
109e0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
109f0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
10a00 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
10a10 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
10a20 79 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  y)!=0.       || 
10a30 28 70 2d 3e 69 50 4b 65 79 3c 30 20 26 26 20 73  (p->iPKey<0 && s
10a40 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
10a50 49 6e 64 65 78 28 70 29 3d 3d 30 29 20 29 3b 0a  Index(p)==0) );.
10a60 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72  .  /* Special pr
10a70 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49 54  ocessing for WIT
10a80 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65  HOUT ROWID Table
10a90 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f 70  s */.  if( tabOp
10aa0 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52  ts & TF_WithoutR
10ab0 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20  owid ){.    if( 
10ac0 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
10ad0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
10ae0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10af0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10b00 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55 54  ,.          "AUT
10b10 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61  OINCREMENT not a
10b20 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f 55  llowed on WITHOU
10b30 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22 29  T ROWID tables")
10b40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
10b50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
10b60 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
10b70 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d  HasPrimaryKey)==
10b80 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
10b90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10ba0 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20  e, "PRIMARY KEY 
10bb0 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65  missing on table
10bc0 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   %s", p->zName);
10bd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10be0 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d    p->tabFlags |=
10bf0 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
10c00 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
10c10 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76  owid;.      conv
10c20 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
10c30 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
10c40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10c50 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
10c60 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
10c70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
10c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10c90 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
10ca0 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
10cb0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
10cc0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
10cd0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
10ce0 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eck ){.    sqlit
10cf0 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
10d00 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
10d10 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c  , NC_IsCheck, 0,
10d20 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d   p->pCheck);.  }
10d30 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10d40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10d50 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
10d60 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
10d70 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f  rage row size fo
10d80 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
10d90 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20  for all implied 
10da0 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74  indices */.  est
10db0 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
10dc0 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  p);.  for(pIdx=p
10dd0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
10de0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
10df0 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49  ){.    estimateI
10e00 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b  ndexWidth(pIdx);
10e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
10e20 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
10e30 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
10e40 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
10e50 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
10e60 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
10e70 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
10e80 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
10e90 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
10ea0 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
10eb0 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
10ec0 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
10ed0 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
10ee0 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
10ef0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
10f00 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
10f10 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
10f20 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
10f30 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
10f40 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
10f50 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
10f60 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
10f70 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
10f80 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
10f90 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
10fa0 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
10fb0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
10fc0 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
10fd0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
10fe0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
10ff0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11000 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
11010 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
11020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11030 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
11040 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20   0);..    /* .  
11050 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
11060 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65  zType for the ne
11070 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e  w view or table.
11080 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11090 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
110a0 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
110b0 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
110c0 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
110d0 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
110e0 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e   = "TABLE";.#ifn
110f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11100 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VIEW.    }else{.
11110 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
11120 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
11130 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
11140 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
11150 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
11160 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
11170 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
11180 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
11190 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
111a0 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
111b0 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
111c0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
111d0 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
111e0 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
111f0 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
11200 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
11210 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
11220 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
11230 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
11240 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
11250 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
11260 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
11270 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
11280 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
11290 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
112a0 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
112b0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
112c0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
112d0 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72  **.    ** A shar
112e0 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c  ed-cache write-l
112f0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ock is not requi
11300 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  red to write to 
11310 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20  the new table,. 
11320 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d     ** as a schem
11330 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65  a-lock must have
11340 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62   already been ob
11350 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65  tained to create
11360 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a   it. Since.    *
11370 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  * a schema-lock 
11380 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
11390 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72  er database user
113a0 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  s, the write-loc
113b0 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62  k would.    ** b
113c0 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  e redundant..   
113d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
113e0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ect ){.      Sel
113f0 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
11400 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53 45   /* Where the SE
11410 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72  LECT should stor
11420 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
11430 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b     int regYield;
11440 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
11450 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f  er holding co-ro
11460 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e  utine entry-poin
11470 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
11480 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f  ddrTop;        /
11490 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d  * Top of the co-
114a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
114b0 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20   int regRec;    
114c0 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64       /* A record
114d0 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e   to be insert in
114e0 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
114f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
11500 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a  gRowid;       /*
11510 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   Rowid of the ne
11520 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74  xt row to insert
11530 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
11540 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a  drInsLoop;    /*
11550 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
11560 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72   for inserting r
11570 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ows */.      Tab
11580 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20  le *pSelTab;    
11590 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74   /* A table that
115a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 53   describes the S
115b0 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
115c0 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c 64  ..      regYield
115d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
115e0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20  m;.      regRec 
115f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11600 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
11610 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11620 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
11630 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
11640 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
11650 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
11660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11670 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
11680 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
11690 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
116a0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
116b0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
116c0 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29   OPFLAG_P2ISREG)
116d0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
116e0 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
116f0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
11700 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11710 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  (v) + 1;.      s
11720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11730 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
11740 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
11750 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
11760 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
11770 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
11780 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
11790 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
117a0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
117b0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
117c0 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
117d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
117e0 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
117f0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f   );.      p->nCo
11800 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
11810 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  l;.      p->aCol
11820 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
11830 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
11840 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
11850 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
11860 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
11870 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
11880 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
11890 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
118a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
118b0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
118c0 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
118d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
118e0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
118f0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
11900 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
11910 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  turn;.      sqli
11920 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
11930 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29  ine(v, regYield)
11940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11950 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11960 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20  ddrTop - 1);.   
11970 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
11980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11990 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
119a0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
119b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
119c0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
119d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
119e0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
119f0 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
11a00 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
11a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
11a20 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
11a30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11a40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11a50 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
11a60 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
11a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11a80 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
11a90 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
11aa0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
11ab0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
11ac0 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
11ad0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11ae0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11af0 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
11b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b10 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
11b20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11b30 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
11b40 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
11b50 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
11b60 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
11b70 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
11b80 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
11b90 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
11ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11bb0 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
11bc0 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
11bd0 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
11be0 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
11bf0 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
11c00 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
11c10 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
11c20 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
11c30 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
11c40 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
11c50 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11c60 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
11c70 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
11c80 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
11c90 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
11ca0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
11cb0 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
11cc0 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
11cd0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
11ce0 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
11cf0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
11d00 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
11d10 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
11d20 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
11d30 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
11d40 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
11d50 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
11d60 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
11d70 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
11d80 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
11d90 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
11da0 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
11db0 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
11dc0 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
11dd0 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
11de0 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
11df0 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
11e00 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
11e10 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
11e20 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79 70  NAME,.      zTyp
11e30 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
11e40 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
11e50 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
11e60 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
11e70 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
11e80 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
11e90 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
11ea0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
11eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
11ec0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
11ed0 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
11ee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11ef0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
11f00 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
11f10 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
11f20 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
11f30 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
11f40 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
11f50 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
11f60 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
11f70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
11f80 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
11f90 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
11fa0 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
11fb0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
11fc0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
11fd0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11fe0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
11ff0 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28   0) );.      if(
12000 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
12010 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
12020 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
12030 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
12040 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
12050 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
12060 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
12070 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
12080 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20   pDb->zDbSName. 
12090 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
120a0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
120b0 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
120c0 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
120d0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
120e0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
120f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
12100 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
12110 61 4f 70 28 70 50 61 72 73 65 2c 20 69 44 62 2c  aOp(pParse, iDb,
12120 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
12130 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
12140 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
12150 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
12160 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
12170 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
12180 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
12190 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
121a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
121b0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
121c0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
121d0 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
121e0 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
121f0 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
12200 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
12210 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
12220 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
12230 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
12240 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
12250 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
12260 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
12270 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ame, p);.    if(
12280 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
12290 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
122a0 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
122b0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
122c0 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
122d0 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ) */.      sqlit
122e0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
122f0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
12300 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
12310 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
12320 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
12330 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
12340 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66  Change;..#ifndef
12350 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
12360 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
12370 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
12380 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
12390 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
123a0 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
123b0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
123c0 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
123d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
123e0 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
123f0 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
12400 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
12410 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
12420 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
12430 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
12440 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
12450 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
12460 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
12470 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
12480 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
12490 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
124a0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
124b0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
124c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
124d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
124e0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
124f0 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
12500 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
12510 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
12520 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
12530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12540 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
12550 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
12560 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
12570 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
12580 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
12590 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
125a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
125b0 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
125c0 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
125d0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
125e0 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
125f0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
12600 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
12610 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
12620 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45   the view */.  E
12630 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73  xprList *pCNames
12640 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69  , /* Optional li
12650 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d  st of view colum
12660 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c  n names */.  Sel
12670 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
12680 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
12690 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
126a0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
126b0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
126c0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
126d0 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
126e0 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
126f0 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
12700 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
12710 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
12720 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
12730 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
12740 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
12750 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
12760 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
12770 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
12780 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
12790 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
127a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
127b0 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
127c0 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
127d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
127e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
127f0 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
12800 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
12810 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72  s");.    goto cr
12820 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
12830 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
12840 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
12850 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
12860 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
12870 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
12880 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
12890 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
128a0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
128b0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
128c0 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50  l;.  sqlite3TwoP
128d0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
128e0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
128f0 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
12900 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12910 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
12920 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
12930 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
12940 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
12950 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  w", pName);.  if
12960 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  ( sqlite3FixSele
12970 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
12980 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  t) ) goto create
12990 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
129a0 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
129b0 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
129c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
129d0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
129e0 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
129f0 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
12a00 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
12a10 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
12a20 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
12a30 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
12a40 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
12a50 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
12a60 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
12a70 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
12a80 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
12a90 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
12aa0 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
12ab0 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rns..  */.  if( 
12ac0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
12ad0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65   ){.    p->pSele
12ae0 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
12af0 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20    pSelect = 0;. 
12b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
12b10 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
12b20 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
12b30 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
12b40 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20 20 70 2d  EDUCE);.  }.  p-
12b50 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
12b60 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
12b70 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55   pCNames, EXPRDU
12b80 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28  P_REDUCE);.  if(
12b90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12ba0 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  d ) goto create_
12bb0 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
12bc0 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
12bd0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
12be0 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
12bf0 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
12c00 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
12c10 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
12c20 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
12c30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e 64  ;.  assert( sEnd
12c40 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e 64  .z[0]!=0 || sEnd
12c50 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  .n==0 );.  if( s
12c60 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
12c70 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
12c80 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
12c90 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
12ca0 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42  int)(sEnd.z - pB
12cb0 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65  egin->z);.  asse
12cc0 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d  rt( n>0 );.  z =
12cd0 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
12ce0 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
12cf0 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e  ace(z[n-1]) ){ n
12d00 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
12d10 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
12d20 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
12d30 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
12d40 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
12d50 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
12d60 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
12d70 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
12d80 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
12d90 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72  sEnd, 0, 0);..cr
12da0 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a  eate_view_fail:.
12db0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12dc0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
12dd0 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  t);.  if( IN_REN
12de0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
12df0 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45    sqlite3RenameE
12e00 78 70 72 6c 69 73 74 55 6e 6d 61 70 28 70 50 61  xprlistUnmap(pPa
12e10 72 73 65 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20  rse, pCNames);. 
12e20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
12e30 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
12e40 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72  CNames);.  retur
12e50 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
12e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
12e70 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
12e80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
12e90 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
12ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12eb0 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54  ALTABLE)./*.** T
12ec0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
12ed0 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
12ee0 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
12ef0 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
12f00 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
12f10 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
12f20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
12f30 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
12f40 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
12f50 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
12f60 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
12f70 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
12f80 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
12f90 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
12fa0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
12fb0 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
12fc0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
12fd0 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
12fe0 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
12ff0 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
13000 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
13010 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
13020 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
13030 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
13040 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
13050 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
13060 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
13070 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
13080 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
13090 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
130a0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
130b0 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
130c0 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
130d0 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
130e0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
130f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13100 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
13110 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d  connection for m
13120 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a  alloc errors */.
13130 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13140 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13150 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69  .  int rc;.#endi
13160 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
13170 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
13180 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61  ION.  sqlite3_xa
13190 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
131a0 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
131b0 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69  pointer */.#endi
131c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  f..  assert( pTa
131d0 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
131e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
131f0 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e 6e  UALTABLE.  db->n
13200 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20  SchemaLock++;.  
13210 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
13220 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
13230 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 64  se, pTable);.  d
13240 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d  b->nSchemaLock--
13250 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
13260 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
13270 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
13280 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
13290 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
132a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
132b0 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
132c0 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
132d0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
132e0 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
132f0 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
13300 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
13310 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
13320 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
13330 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
13340 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
13350 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
13360 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
13370 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
13380 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
13390 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
133a0 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
133b0 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
133c0 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
133d0 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
133e0 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
133f0 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
13400 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
13410 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
13420 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
13430 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
13440 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
13450 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
13460 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
13470 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
13480 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73  e error above is
13490 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
134a0 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
134b0 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42  is point..  ** B
134c0 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
134d0 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69   test is still i
134e0 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64  mportant as it d
134f0 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a  oes come up.  **
13500 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
13510 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  g:.  ** .  **   
13520 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
13530 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a  ain.ex1(a);.  **
13540 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
13550 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c   VIEW ex1 AS SEL
13560 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a  ECT a FROM ex1;.
13570 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
13580 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b  * FROM temp.ex1;
13590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
135a0 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
135b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
135c0 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
135d0 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
135e0 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
135f0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
13600 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
13610 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
13620 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
13630 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
13640 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
13650 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
13660 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
13670 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
13680 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
13690 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
136a0 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
136b0 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
136c0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
136d0 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
136e0 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
136f0 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
13700 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
13710 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
13720 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
13730 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
13740 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
13750 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
13760 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
13770 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
13780 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
13790 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
137a0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
137b0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
137c0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
137d0 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
137e0 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
137f0 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
13800 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
13810 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 23 69    if( pSel ){.#i
13820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13830 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
13840 20 75 38 20 65 50 61 72 73 65 4d 6f 64 65 20 3d   u8 eParseMode =
13850 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
13860 6f 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ode;.    pParse-
13870 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 50 41  >eParseMode = PA
13880 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b  RSE_MODE_NORMAL;
13890 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 20 3d 20  .#endif.    n = 
138a0 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
138b0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
138c0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
138d0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
138e0 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
138f0 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62  Col = -1;.    db
13900 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
13910 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  able++;.#ifndef 
13920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
13930 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41  ORIZATION.    xA
13940 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
13950 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
13960 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20   0;.    pSelTab 
13970 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
13980 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
13990 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  e, pSel);.    db
139a0 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
139b0 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54  .#else.    pSelT
139c0 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
139d0 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
139e0 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e  arse, pSel);.#en
139f0 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  dif.    pParse->
13a00 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
13a10 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  ( pTable->pCheck
13a20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45   ){.      /* CRE
13a30 41 54 45 20 56 49 45 57 20 6e 61 6d 65 28 61 72  ATE VIEW name(ar
13a40 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e 0a 20 20  glist) AS ....  
13a50 20 20 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 73      ** The names
13a60 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
13a70 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  in the table are
13a80 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20 20 20 20   taken from.    
13a90 20 20 2a 2a 20 61 72 67 6c 69 73 74 20 77 68 69    ** arglist whi
13aa0 63 68 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ch is stored in 
13ab0 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2e 20  pTable->pCheck. 
13ac0 20 54 68 65 20 70 43 68 65 63 6b 20 66 69 65 6c   The pCheck fiel
13ad0 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  d.      ** norma
13ae0 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45 43 4b 20  lly holds CHECK 
13af0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
13b00 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
13b10 2c 20 62 75 74 20 66 6f 72 0a 20 20 20 20 20 20  , but for.      
13b20 2a 2a 20 61 20 56 49 45 57 20 69 74 20 68 6f 6c  ** a VIEW it hol
13b30 64 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  ds the list of c
13b40 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20 20  olumn names..   
13b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
13b60 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
13b70 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
13b80 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a  Table->pCheck, .
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20   &pTable->nCol, 
13bc0 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  &pTable->aCol);.
13bd0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
13be0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20  llocFailed==0 . 
13bf0 20 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d        && pParse-
13c00 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20 20 20 20  >nErr==0.       
13c10 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  && pTable->nCol=
13c20 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSel->pEList->n
13c30 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
13c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
13c50 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
13c60 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
13c70 72 73 65 2c 20 70 54 61 62 6c 65 2c 20 70 53 65  rse, pTable, pSe
13c80 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
13c90 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 54 61  }else if( pSelTa
13ca0 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52  b ){.      /* CR
13cb0 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 20 41  EATE VIEW name A
13cc0 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74 20 61 6e  S...  without an
13cd0 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e 20   argument list. 
13ce0 20 43 6f 6e 73 74 72 75 63 74 0a 20 20 20 20 20   Construct.     
13cf0 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** the column n
13d00 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 53 45  ames from the SE
13d10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
13d20 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
13d30 76 69 65 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  view..      */. 
13d40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
13d50 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
13d60 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
13d70 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
13d80 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  ol;.      pTable
13d90 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
13da0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
13db0 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
13dc0 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
13dd0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
13de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13df0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13e00 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53  b, 0, pTable->pS
13e10 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 7d 65  chema) );.    }e
13e20 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
13e30 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
13e40 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
13e50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
13e60 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
13e70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
13e80 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
13e90 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
13ea0 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
13eb0 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65 66 20 53  ble--;.#ifndef S
13ec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
13ed0 54 41 42 4c 45 0a 20 20 20 20 70 50 61 72 73 65  TABLE.    pParse
13ee0 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 65  ->eParseMode = e
13ef0 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65 6e 64 69  ParseMode;.#endi
13f00 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  f.  } else {.   
13f10 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70   nErr++;.  }.  p
13f20 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
13f30 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44  schemaFlags |= D
13f40 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
13f50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13f60 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
13f70 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
13f80 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c  nNames(db, pTabl
13f90 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  e);.    pTable->
13fa0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 54  aCol = 0;.    pT
13fb0 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
13fc0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
13fd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
13fe0 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
13ff0 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
14000 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14010 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
14020 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14030 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
14040 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
14050 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
14060 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
14070 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
14080 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
14090 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
140a0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
140b0 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
140c0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
140d0 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
140e0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
140f0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
14100 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20  eld(db, idx, 0) 
14110 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  );.  if( !DbHasP
14120 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
14130 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
14140 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
14150 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
14160 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
14170 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
14180 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
14190 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
141a0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
141b0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
141c0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
141d0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
141e0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
141f0 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
14200 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ab);.      pTab-
14210 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
14220 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b   pTab->nCol = 0;
14230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
14240 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
14250 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
14260 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
14270 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
14280 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
14290 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
142a0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
142b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
142c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
142d0 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
142e0 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
142f0 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
14300 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
14310 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
14320 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
14330 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
14340 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
14350 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
14360 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
14370 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
14380 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
14390 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32  *.** Ticket #172
143a0 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74  8:  The symbol t
143b0 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c  able might still
143c0 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61   contain informa
143d0 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
143e0 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73  s and/or indices
143f0 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72   that are the pr
14400 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64  ocess of being d
14410 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f  eleted..** If yo
14420 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f  u are unlucky, o
14430 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
14440 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74  ted indices or t
14450 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68  ables might.** h
14460 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ave the same roo
14470 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20  tpage number as 
14480 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f  the real table o
14490 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  r index that is.
144a0 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20  ** being moved. 
144b0 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74   So we cannot st
144c0 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74  op searching aft
144d0 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  er the first mat
144e0 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ch .** because t
144f0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d  he first match m
14500 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20  ight be for one 
14510 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69  of the deleted i
14520 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62  ndices.** or tab
14530 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  les and not the 
14540 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74  table/index that
14550 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69   is actually bei
14560 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20  ng moved..** We 
14570 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f  must continue lo
14580 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20  oping until all 
14590 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
145a0 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70  es with.** rootp
145b0 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20  age==iFrom have 
145c0 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
145d0 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67  o have a rootpag
145e0 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f  e of iTo.** in o
145f0 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61  rder to be certa
14600 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74  in that we got t
14610 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f  he right one..*/
14620 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14630 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14640 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
14650 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65  PageMoved(sqlite
14660 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
14670 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
14680 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
14690 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a  *pElem;.  Hash *
146a0 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62  pHash;.  Db *pDb
146b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
146c0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
146d0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
146e0 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
146f0 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73  aDb[iDb];.  pHas
14700 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
14710 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f  a->tblHash;.  fo
14720 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
14730 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
14740 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
14750 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
14760 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
14770 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
14780 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
14790 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
147a0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
147b0 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
147c0 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  o;.    }.  }.  p
147d0 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
147e0 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
147f0 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
14800 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
14810 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
14820 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
14830 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
14840 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
14850 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
14860 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74  .    if( pIdx->t
14870 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
14880 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d      pIdx->tnum =
14890 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
148a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
148b0 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
148c0 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
148d0 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
148e0 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
148f0 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
14900 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
14910 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
14920 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
14930 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
14940 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
14950 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
14960 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
14970 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
14980 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
14990 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
149a0 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
149b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
149c0 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
149d0 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
149e0 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
149f0 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
14a00 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
14a10 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
14a20 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14a30 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
14a40 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14a50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 54 61  arse);.  if( iTa
14a60 62 6c 65 3c 32 20 29 20 73 71 6c 69 74 65 33 45  ble<2 ) sqlite3E
14a70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14a80 22 63 6f 72 72 75 70 74 20 73 63 68 65 6d 61 22  "corrupt schema"
14a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14aa0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
14ab0 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
14ac0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
14ad0 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
14ae0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
14af0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14b00 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
14b10 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
14b20 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
14b30 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
14b40 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
14b50 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
14b60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
14b70 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
14b80 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
14b90 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
14ba0 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
14bb0 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
14bc0 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
14bd0 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
14be0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
14bf0 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
14c00 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
14c10 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
14c20 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
14c30 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
14c40 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67  ster NNN.  See g
14c50 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73  rammar rules ass
14c60 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14c70 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a   TK_REGISTER.  *
14c80 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69  * token for addi
14c90 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
14ca0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  on..  */.  sqlit
14cb0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
14cc0 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
14cd0 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
14ce0 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
14cf0 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
14d00 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
14d10 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
14d20 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
14d30 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20  R_NAME, iTable, 
14d40 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a  r1, r1);.#endif.
14d50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14d60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
14d70 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  r1);.}../*.** Wr
14d80 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
14d90 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
14da0 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
14db0 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
14dc0 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
14dd0 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
14de0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
14df0 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
14e00 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
14e10 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
14e20 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
14e30 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
14e40 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
14e50 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
14e60 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
14e70 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
14e80 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
14e90 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
14ea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
14eb0 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
14ec0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
14ed0 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66   *pTab){.  /* If
14ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
14ef0 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d  y be auto-vacuum
14f00 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c   capable (if SQL
14f10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14f20 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  UUM.  ** is not 
14f30 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69  defined), then i
14f40 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
14f50 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  o call OP_Destro
14f60 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61  y on the.  ** ta
14f70 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f  ble and index ro
14f80 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65  ot-pages in orde
14f90 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  r, starting with
14fa0 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
14fb0 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72   .  ** largest r
14fc0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
14fd0 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
14fe0 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
14ff0 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a  e root-pages.  *
15000 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  * to be destroye
15010 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62  d is relocated b
15020 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f  y an earlier OP_
15030 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66  Destroy. i.e. if
15040 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77   the.  ** follow
15050 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a  ing were coded:.
15060 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73    **.  ** OP_Des
15070 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e  troy 4 0.  ** ..
15080 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  ..  ** OP_Destro
15090 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y 5 0.  **.  ** 
150a0 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20  and root page 5 
150b0 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74  happened to be t
150c0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
150d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  page number in t
150e0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
150f0 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65  , then root page
15100 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65   5 would be move
15110 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74  d to page 4 by t
15120 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73  he .  ** "OP_Des
15130 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65  troy 4 0" opcode
15140 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74  . The subsequent
15150 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30   "OP_Destroy 5 0
15160 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a  " would hit.  **
15170 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67   a free-list pag
15180 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  e..  */.  int iT
15190 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ab = pTab->tnum;
151a0 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65  .  int iDestroye
151b0 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
151c0 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20   1 ){.    Index 
151d0 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69  *pIdx;.    int i
151e0 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20  Largest = 0;..  
151f0 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64    if( iDestroyed
15200 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73  ==0 || iTab<iDes
15210 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20  troyed ){.      
15220 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b  iLargest = iTab;
15230 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
15240 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
15250 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
15260 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
15270 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78   int iIdx = pIdx
15280 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73  ->tnum;.      as
15290 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
152a0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
152b0 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ma );.      if( 
152c0 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
152d0 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
152e0 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
152f0 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
15300 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
15310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15320 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
15330 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
15340 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
15350 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
15360 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
15370 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
15380 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
15390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
153a0 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
153b0 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
153c0 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
153d0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
153e0 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
153f0 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
15400 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
15410 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
15420 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
15430 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
15440 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e  tN tables (for N
15450 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20   in (1,2,3)).** 
15460 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44  after a DROP IND
15470 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45  EX or DROP TABLE
15480 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
15490 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
154a0 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
154b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
154c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
154d0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
154e0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20   */.  int iDb,  
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15500 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d  The database num
15510 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ber */.  const c
15520 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20  har *zType,     
15530 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c  /* "idx" or "tbl
15540 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  " */.  const cha
15550 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a  r *zName      /*
15560 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f   Name of index o
15570 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  r table */.){.  
15580 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
15590 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70  har *zDbName = p
155a0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
155b0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
155c0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69  for(i=1; i<=4; i
155d0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  ++){.    char zT
155e0 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ab[24];.    sqli
155f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
15600 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22  eof(zTab),zTab,"
15610 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69  sqlite_stat%d",i
15620 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
15630 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
15640 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44  se->db, zTab, zD
15650 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
15660 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
15670 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
15680 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
15690 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
156a0 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
156b0 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65  ame, zTab, zType
156c0 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  , zName.      );
156d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
156e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
156f0 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  e to drop a tabl
15700 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
15710 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
15720 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
15730 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20  able *pTab, int 
15740 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29  iDb, int isView)
15750 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
15760 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
15770 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67  rse->db;.  Trigg
15780 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
15790 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
157a0 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20  Db[iDb];..  v = 
157b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
157c0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
157d0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
157e0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
157f0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
15800 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
15810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15820 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
15830 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
15840 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
15850 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
15860 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  Begin);.  }.#end
15870 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
15880 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
15890 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
158a0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
158b0 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73  ed. Code.  ** is
158c0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
158d0 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
158e0 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
158f0 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69  and/or.  ** sqli
15900 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
15910 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  f required..  */
15920 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
15930 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
15940 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
15950 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
15960 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  r ){.    assert(
15970 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
15980 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
15990 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54  a || .        pT
159a0 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
159b0 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
159c0 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
159d0 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
159e0 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
159f0 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  r);.    pTrigger
15a00 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
15a10 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  xt;.  }..#ifndef
15a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15a30 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
15a40 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
15a50 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
15a60 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
15a70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
15a80 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
15a90 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
15aa0 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
15ab0 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
15ac0 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74  ropped.  ** at t
15ad0 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
15ae0 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
15af0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
15b00 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20  e needs to.  ** 
15b10 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
15b20 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
15b30 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
15b40 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
15b50 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
15b60 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
15b70 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
15b80 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
15b90 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
15ba0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
15bb0 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
15bc0 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
15bd0 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  Q",.      pDb->z
15be0 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  DbSName, pTab->z
15bf0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Name.    );.  }.
15c00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
15c10 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
15c20 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
15c30 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
15c40 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
15c50 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
15c60 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
15c70 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
15c80 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
15c90 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79  letes.  ** every
15ca0 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
15cb0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
15cc0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
15cd0 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
15ce0 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
15cf0 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
15d00 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61   separately beca
15d10 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
15d20 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  n be.  ** create
15d30 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
15d40 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
15d50 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
15d60 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61   another.  ** da
15d70 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73  tabase..  */.  s
15d80 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
15d90 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
15da0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
15db0 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
15dc0 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
15dd0 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
15de0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c    pDb->zDbSName,
15df0 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54   MASTER_NAME, pT
15e00 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
15e10 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
15e20 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
15e30 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c  .    destroyTabl
15e40 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
15e50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
15e60 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
15e70 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
15e80 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
15e90 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20  and modify.  ** 
15ea0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
15eb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  e..  */.  if( Is
15ec0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
15ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15ee0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
15ef0 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
15f00 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
15f10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  );.    sqlite3Ma
15f20 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
15f30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15f40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
15f50 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
15f60 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
15f70 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68   0);.  sqlite3Ch
15f80 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
15f90 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  e, iDb);.  sqlit
15fa0 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
15fb0 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
15fc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15fd0 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
15fe0 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
15ff0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
16000 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
16010 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
16020 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
16030 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
16040 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
16050 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
16060 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
16070 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
16080 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
16090 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
160a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
160b0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
160c0 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Db;..  if( db->m
160d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
160e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
160f0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
16100 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
16110 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Err==0 );.  asse
16120 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
16130 3d 31 20 29 3b 0a 20 20 69 66 28 20 21 49 73 53  =1 );.  if( !IsS
16140 68 61 72 65 64 53 63 68 65 6d 61 28 64 62 29 20  haredSchema(db) 
16150 26 26 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  && sqlite3ReadSc
16160 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
16170 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
16180 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  ble;.  if( noErr
16190 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
161a0 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  rr++;.  assert( 
161b0 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
161c0 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57  iew==LOCATE_VIEW
161d0 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
161e0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
161f0 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
16200 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
16210 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
16220 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
16230 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
16240 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
16250 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
16260 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
16270 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
16280 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
16290 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
162a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
162b0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
162c0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
162d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
162e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
162f0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
16300 62 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  b );.  sqlite3Sc
16310 68 65 6d 61 57 72 69 74 61 62 6c 65 28 70 50 61  hemaWritable(pPa
16320 72 73 65 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a  rse, iDb);..  /*
16330 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
16340 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
16350 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
16360 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
16370 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
16380 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
16390 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
163a0 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
163b0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
163c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
163d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
163e0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
163f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16400 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
16410 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
16420 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
16430 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
16440 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
16450 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
16460 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
16470 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
16480 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
16490 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
164a0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
164b0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
164c0 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
164d0 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
164e0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
164f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16500 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
16510 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
16520 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
16530 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
16540 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
16550 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
16560 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
16570 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
16580 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
16590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
165a0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
165b0 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
165c0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
165d0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
165e0 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
165f0 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
16600 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
16610 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
16620 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
16630 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
16640 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
16650 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
16660 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
16670 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
16680 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16690 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
166a0 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
166b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
166c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
166d0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
166e0 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
166f0 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
16700 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
16710 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
16720 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
16730 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16740 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
16750 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
16760 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
16770 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
16780 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
16790 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
167a0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
167b0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
167c0 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
167d0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
167e0 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
167f0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20   "sqlite_stat", 
16800 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  11)!=0 ){.    sq
16810 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16820 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
16830 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
16840 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
16850 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
16860 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
16870 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16880 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
16890 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
168a0 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
168b0 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
168c0 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
168d0 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
168e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
168f0 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
16900 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
16910 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16920 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
16930 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
16940 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
16950 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
16960 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
16970 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
16980 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
16990 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
169a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
169b0 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
169c0 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
169d0 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
169e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
169f0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
16a00 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
16a10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16a20 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
16a30 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
16a40 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
16a50 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
16a60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16a70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16a80 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
16a90 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16aa0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
16ab0 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
16ac0 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
16ad0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
16ae0 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
16af0 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
16b00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
16b10 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
16b20 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
16b30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
16b40 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
16b50 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
16b60 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
16b70 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
16b80 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
16b90 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
16ba0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
16bb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16bc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
16bd0 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
16be0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
16bf0 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
16c00 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
16c10 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
16c20 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
16c30 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
16c40 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
16c50 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
16c60 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
16c70 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
16c80 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
16c90 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
16ca0 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
16cb0 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
16cc0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
16cd0 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61  e referred to (a
16ce0 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74  .k.a the "parent
16cf0 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f  " table).  pToCo
16d00 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f  l is a list.** o
16d10 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
16d20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65  parent pTo table
16d30 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
16d40 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
16d50 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
16d60 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
16d70 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
16d80 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
16d90 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
16da0 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
16db0 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
16dc0 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
16dd0 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
16de0 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
16df0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
16e00 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
16e10 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
16e20 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
16e30 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
16e40 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
16e50 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
16e60 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
16e70 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
16e80 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
16e90 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
16ea0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
16eb0 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
16ec0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
16ed0 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
16ee0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16ef0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
16f00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
16f10 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
16f20 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
16f30 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
16f40 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
16f50 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
16f60 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
16f70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16f80 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
16f90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
16fa0 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
16fb0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
16fc0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
16fd0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
16fe0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
16ff0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
17000 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
17010 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17020 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
17030 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
17040 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
17050 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
17060 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
17070 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
17080 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
17090 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
170a0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
170b0 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
170c0 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
170d0 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
170e0 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
170f0 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
17100 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
17110 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
17120 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
17130 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
17140 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
17150 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
17160 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
17170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
17180 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17190 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
171a0 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
171b0 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
171c0 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
171d0 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
171e0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
171f0 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
17200 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
17210 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
17220 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
17230 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
17240 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
17250 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
17260 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17270 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
17280 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
17290 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
172a0 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
172b0 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
172c0 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
172d0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
172e0 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
172f0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
17300 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
17310 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
17320 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
17330 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
17340 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  ey) + (nCol-1)*s
17350 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
17360 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
17370 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
17380 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
17390 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
173a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
173b0 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
173c0 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
173d0 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
173e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
173f0 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
17400 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
17410 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
17420 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
17430 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
17440 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
17450 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
17460 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
17470 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
17480 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a  ey->aCol[nCol];.
17490 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
174a0 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  ;.  if( IN_RENAM
174b0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
174c0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
174d0 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
174e0 6f 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20  oid*)z, pTo);.  
174f0 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  }.  memcpy(z, pT
17500 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
17510 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
17520 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
17530 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  (z);.  z += pTo-
17540 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e  >n+1;.  pFKey->n
17550 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
17560 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
17570 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
17580 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
17590 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
175a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
175b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
175c0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
175d0 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
175e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
175f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
17600 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
17610 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
17620 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
17630 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
17640 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
17650 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
17660 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
17670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17680 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
17690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
176a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
176b0 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
176c0 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
176d0 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
176e0 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
176f0 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
17700 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
17710 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
17720 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
17730 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
17740 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
17750 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
17760 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
17770 65 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  e, &pFKey->aCol[
17780 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  i], pFromCol->a[
17790 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
177a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
177b0 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
177c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
177d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
177e0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
177f0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
17800 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
17810 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
17820 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
17830 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
17840 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
17850 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
17860 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
17870 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
17880 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
17890 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
178a0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
178b0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
178c0 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
178d0 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
178e0 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
178f0 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
17900 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
17910 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
17920 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
17930 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
17940 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
17950 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
17960 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
17970 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
17980 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
17990 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
179a0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
179b0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70  Held(db, 0, p->p
179c0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65  Schema) );.  pNe
179d0 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
179e0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
179f0 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
17a00 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
17a10 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64  FKey->zTo, (void
17a20 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
17a30 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
17a40 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
17a50 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
17a60 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
17a70 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54    }.  if( pNextT
17a80 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
17a90 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
17aa0 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65  o==0 );.    pFKe
17ab0 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65  y->pNextTo = pNe
17ac0 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54  xtTo;.    pNextT
17ad0 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b  o->pPrevTo = pFK
17ae0 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69  ey;.  }..  /* Li
17af0 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
17b00 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
17b10 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
17b20 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
17b30 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
17b40 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
17b50 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17b60 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e  (db, pFKey);.#en
17b70 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
17b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
17b90 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
17ba0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
17bb0 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c  ete(db, pFromCol
17bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
17bd0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
17be0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
17bf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17c00 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
17c10 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
17c20 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
17c30 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
17c40 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
17c50 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
17c60 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
17c70 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
17c80 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
17c90 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
17ca0 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
17cb0 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
17cc0 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
17cd0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
17ce0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
17cf0 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
17d00 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
17d10 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
17d20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
17d30 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
17d40 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
17d50 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
17d60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17d70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
17d80 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
17d90 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
17da0 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
17db0 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
17dc0 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
17dd0 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
17de0 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
17df0 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20  sDeferred==0 || 
17e00 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b  isDeferred==1 );
17e10 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d   /* EV: R-30323-
17e20 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79  21917 */.  pFKey
17e30 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28  ->isDeferred = (
17e40 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23  u8)isDeferred;.#
17e50 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
17e60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
17e70 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
17e80 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
17e90 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
17ea0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
17eb0 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
17ec0 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
17ed0 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
17ee0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
17ef0 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
17f00 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
17f10 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
17f20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
17f30 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
17f40 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
17f50 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
17f60 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72   created.  The r
17f70 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65  egister specifie
17f80 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
17f90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
17fa0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
17fb0 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
17fc0 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
17fd0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
17fe0 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
17ff0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
18000 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
18010 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
18020 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
18030 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
18040 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
18050 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
18060 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
18070 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
18080 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
18090 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
180a0 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
180b0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
180c0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
180d0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
180e0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
180f0 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
18100 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
18110 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
18120 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
18130 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
18140 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
18150 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
18160 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
18170 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
18180 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  ex */.  int iSor
18190 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
181a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
181b0 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53   opened by OpenS
181c0 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65  orter (if in use
181d0 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  ) */.  int addr1
181e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
181f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18200 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
18210 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20  */.  int addr2; 
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74      /* Address t
18240 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65  o jump to for ne
18250 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
18260 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
18290 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
182a0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20  iPartIdxLabel;  
182b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
182c0 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c  mp to this label
182d0 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a   to skip a row *
182e0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18300 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
18310 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
18320 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
18330 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18350 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72    /* KeyInfo for
18360 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
18370 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
18380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18390 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
183a0 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72  ssembled index r
183b0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
183c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
183d0 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
183e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
183f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
18400 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
18410 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
18420 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
18430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18440 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
18450 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
18460 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
18470 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
18480 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
18490 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
184a0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29  [iDb].zDbSName )
184b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
184c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
184d0 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
184e0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
184f0 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
18500 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
18510 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
18520 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
18530 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
18540 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
18550 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
18560 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
18570 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
18580 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
18590 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
185a0 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
185b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
185c0 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
185d0 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
185e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
185f0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
18600 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  ndex);.  assert(
18610 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
18620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
18630 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
18640 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
18650 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
18660 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
18670 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
18680 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
18690 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
186a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
186b0 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
186c0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
186d0 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
18700 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
18710 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
18720 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
18730 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
18740 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
18750 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
18760 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
18770 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
18780 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
18790 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
187a0 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
187b0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
187c0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
187d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
187e0 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
187f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18800 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
18810 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18820 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
18830 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50  te3MultiWrite(pP
18840 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  arse);..  sqlite
18850 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
18860 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c  y(pParse,pIndex,
18870 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30  iTab,regRecord,0
18880 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c  ,&iPartIdxLabel,
18890 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0,0);.  sqlite3V
188a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
188b0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53  SorterInsert, iS
188c0 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64  orter, regRecord
188d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  );.  sqlite3Reso
188e0 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
188f0 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78  pParse, iPartIdx
18900 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
18910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18920 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
18930 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  dr1+1); VdbeCove
18940 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
18950 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18960 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20  , addr1);.  if( 
18970 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20  memRootPage<0 ) 
18980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18990 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  2(v, OP_Clear, t
189a0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  num, iDb);.  sql
189b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
189c0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
189d0 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
189e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
189f0 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
18a00 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ey, P4_KEYINFO);
18a10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
18a20 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
18a30 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f  _BULKCSR|((memRo
18a40 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41  otPage>=0)?OPFLA
18a50 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a  G_P2ISREG:0));..
18a60 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
18a70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18a80 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53  P_SorterSort, iS
18a90 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43  orter, 0); VdbeC
18aa0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
18ab0 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
18ac0 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
18ad0 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56  nt j2 = sqlite3V
18ae0 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20  dbeGoto(v, 1);. 
18af0 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
18b00 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18b10 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
18b20 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74  3VdbeVerifyAbort
18b30 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74  able(v, OE_Abort
18b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18b50 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
18b60 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c  P_SorterCompare,
18b70 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65   iSorter, j2, re
18b80 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
18bb0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
18bc0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
18bd0 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
18be0 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72  (pParse, OE_Abor
18bf0 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  t, pIndex);.    
18c00 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
18c10 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65  ere(v, j2);.  }e
18c20 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d  lse{.    addr2 =
18c30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
18c40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a  entAddr(v);.  }.
18c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18c60 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
18c70 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72  Data, iSorter, r
18c80 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b  egRecord, iIdx);
18c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18ca0 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45  dOp1(v, OP_SeekE
18cb0 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  nd, iIdx);.  sql
18cc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18cd0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
18ce0 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  iIdx, regRecord)
18cf0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
18d00 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
18d10 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
18d20 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
18d30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18d40 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
18d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18d60 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
18d70 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
18d80 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
18d90 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
18da0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
18db0 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
18dc0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18dd0 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
18de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18df0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
18e00 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
18e10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18e20 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
18e30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
18e40 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
18e50 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
18e60 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
18e70 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
18e80 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
18e90 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
18ea0 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
18eb0 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
18ec0 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
18ed0 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
18ee0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
18ef0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
18f00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
18f10 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
18f20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
18f30 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
18f40 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
18f50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
18f60 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18f70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18f80 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
18f90 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
18fa0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
18fb0 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
18fc0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
18fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18fe0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18ff0 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
19000 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
19010 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
19020 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
19030 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
19040 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
19050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19060 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
19070 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
19080 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
19090 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
190a0 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
190b0 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
190c0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
190d0 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
190e0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
190f0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
19100 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
19110 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
19120 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
19130 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
19140 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
19150 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
19160 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
19170 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
19180 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
19190 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
191a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
191b0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
191c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
191d0 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
191e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
191f0 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
19200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19210 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
19220 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
19230 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
19240 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
19250 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
19260 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
19270 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
19280 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
19290 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
192a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45  (const char**)pE
192b0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
192c0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
192d0 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
192e0 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
192f0 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
19300 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
19310 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
19320 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
19330 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
19340 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
19350 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
19360 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
19370 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
19380 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
19390 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
193a0 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
193b0 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
193c0 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
193d0 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
193e0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
193f0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
19400 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
19410 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
19420 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
19430 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
19440 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
19450 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
19460 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
19470 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
19480 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
19490 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
194a0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
194b0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
194c0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
194d0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
194e0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
194f0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
19500 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
19510 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
19520 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
19530 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
19540 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
19550 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
19560 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
19570 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
19580 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
19590 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
195a0 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
195b0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
195c0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
195d0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
195e0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
195f0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
19600 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
19610 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
19620 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
19630 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
19640 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
19650 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
19660 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
19670 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
19680 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
19690 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
196a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
196b0 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
196c0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
196d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
196e0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
196f0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
19700 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
19710 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
19720 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
19730 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
19740 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
19750 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
19760 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
19770 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
19780 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
19790 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
197a0 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
197b0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
197c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
197d0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
197e0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
197f0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
19800 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
19810 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
19820 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
19830 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
19840 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
19850 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
19860 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
19870 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
19880 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
19890 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
198a0 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
198b0 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
198c0 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
198d0 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
198e0 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74  xist,    /* Omit
198f0 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
19900 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
19910 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20 20  /.  u8 idxType  
19920 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
19930 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  dex type */.){. 
19940 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
19950 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
19960 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
19970 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
19980 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  = 0;   /* The in
19990 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
199a0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
199b0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  me = 0;     /* N
199c0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
199d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
199e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
199f0 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
19a00 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  rs in zName */. 
19a10 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46   int i, j;.  DbF
19a20 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
19a30 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
19a40 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
19a50 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
19a60 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
19a70 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
19a80 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
19a90 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
19aa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
19ab0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
19ac0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
19ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
19ae0 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
19af0 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
19b00 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
19b10 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
19b20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19b30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19b40 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
19b50 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
19b60 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
19b70 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
19b80 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
19b90 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
19ba0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19bb0 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
19bc0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
19bd0 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
19be0 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c00 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
19c10 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d  ted for zExtra[]
19c20 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
19c30 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
19c40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19c50 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e   of extra column
19c60 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68  s needed */.  ch
19c70 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20  ar *zExtra = 0; 
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19c90 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66  * Extra space af
19ca0 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
19cb0 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ject */.  Index 
19cc0 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pPk = 0;      /
19cd0 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  * PRIMARY KEY in
19ce0 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
19cf0 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
19d00 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
19d10 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
19d20 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  e->nErr>0 ){.   
19d30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19d40 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
19d50 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  f( IN_DECLARE_VT
19d60 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d 53  AB && idxType!=S
19d70 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
19d80 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20  IMARYKEY ){.    
19d90 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19da0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
19db0 28 20 21 49 73 53 68 61 72 65 64 53 63 68 65 6d  ( !IsSharedSchem
19dc0 61 28 64 62 29 20 26 26 20 53 51 4c 49 54 45 5f  a(db) && SQLITE_
19dd0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
19de0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
19df0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
19e00 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
19e10 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
19e20 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
19e30 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
19e40 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
19e50 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
19e60 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
19e70 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
19e80 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
19e90 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
19ea0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
19eb0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
19ec0 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
19ed0 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
19ee0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
19ef0 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
19f00 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
19f10 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
19f20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
19f30 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
19f40 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
19f50 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
19f60 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
19f70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
19f80 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
19f90 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19fa0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
19fb0 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61  rt( pName && pNa
19fc0 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65  me->z );..#ifnde
19fd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
19fe0 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  MPDB.    /* If t
19ff0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
1a000 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
1a010 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c  heck if the tabl
1a020 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
1a030 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
1a040 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
1a050 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64  e to 1. Do not d
1a060 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66  o this.    ** if
1a070 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20   initialising a 
1a080 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1a090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a0a0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
1a0b0 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  {.      pTab = s
1a0c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
1a0d0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
1a0e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
1a0f0 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
1a100 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
1a110 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
1a120 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
1a130 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
1a140 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
1a150 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  dif..    sqlite3
1a160 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
1a170 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64  Parse, iDb, "ind
1a180 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ex", pName);.   
1a190 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
1a1a0 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
1a1b0 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  blName) ){.     
1a1c0 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
1a1d0 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
1a1e0 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
1a1f0 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
1a200 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
1a210 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
1a220 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
1a230 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1a240 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
1a250 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
1a260 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
1a270 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65  se, 0, &pTblName
1a280 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73  ->a[0]);.    ass
1a290 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1a2a0 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62  ailed==0 || pTab
1a2b0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
1a2c0 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
1a2d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a2e0 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20  .    if( iDb==1 
1a2f0 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  && db->aDb[iDb].
1a300 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70  pSchema!=pTab->p
1a310 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
1a320 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a330 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1a340 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61      "cannot crea
1a350 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20  te a TEMP index 
1a360 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c  on non-TEMP tabl
1a370 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20  e \"%s\"",.     
1a380 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1a390 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
1a3a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a3c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
1a3d0 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50  ) pPk = sqlite3P
1a3e0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1a3f0 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Tab);.  }else{. 
1a400 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1a410 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1a420 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a  t( pStart==0 );.
1a430 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
1a440 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
1a450 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
1a460 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a470 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20  ndex;.    iDb = 
1a480 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1a490 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
1a4a0 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70  Schema);.  }.  p
1a4b0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
1a4c0 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  b];..  assert( p
1a4d0 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
1a4e0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1a4f0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==0 );.  if( sql
1a500 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
1a510 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
1a520 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
1a530 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62     && db->init.b
1a540 75 73 79 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  usy==0.       &&
1a550 20 70 54 62 6c 4e 61 6d 65 21 3d 30 0a 23 69 66   pTblName!=0.#if
1a560 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
1a570 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
1a580 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65     && sqlite3Use
1a590 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d  rAuthTable(pTab-
1a5a0 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69  >zName)==0.#endi
1a5b0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1a5c0 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41 53  ALLOW_SQLITE_MAS
1a5d0 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TER_INDEX.      
1a5e0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1a5f0 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b  mp(&pTab->zName[
1a600 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d 30 0a  7],"master")!=0.
1a610 23 65 6e 64 69 66 0a 20 29 7b 0a 20 20 20 20 73  #endif. ){.    s
1a620 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a630 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
1a640 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
1a650 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
1a660 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
1a670 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a680 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1a690 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
1a6a0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1a6b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1a6c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a6d0 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
1a6e0 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
1a6f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a700 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
1a710 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1a720 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a730 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
1a740 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1a750 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a760 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
1a770 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
1a780 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
1a790 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a7a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1a7b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
1a7c0 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
1a7d0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
1a7e0 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
1a7f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
1a800 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
1a810 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
1a820 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
1a830 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
1a840 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
1a850 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
1a860 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
1a870 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
1a880 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
1a890 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
1a8a0 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
1a8b0 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
1a8c0 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
1a8d0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
1a8e0 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
1a8f0 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
1a900 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
1a910 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
1a920 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
1a930 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
1a940 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
1a950 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
1a960 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
1a970 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
1a980 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1a990 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
1a9a0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1a9b0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
1a9c0 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
1a9d0 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
1a9e0 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
1a9f0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1aa00 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1aa10 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
1aa20 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
1aa30 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1aa40 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
1aa50 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20  pName->z!=0 );. 
1aa60 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1aa70 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
1aa80 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
1aa90 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
1aaa0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1aab0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1aac0 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d     if( !IN_RENAM
1aad0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1aae0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1aaf0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  busy ){.        
1ab00 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1ab10 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
1ab20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
1ab30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ab40 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
1ab50 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
1ab60 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
1ab70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1ab80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1ab90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1aba0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1abb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1abc0 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
1abd0 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
1abe0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
1abf0 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
1ac00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1ac10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ac20 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
1ac30 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
1ac40 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
1ac50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ac60 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
1ac70 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
1ac80 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1ac90 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1aca0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1acb0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
1acc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1acd0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1ace0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1acf0 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
1ad00 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
1ad10 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
1ad20 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
1ad30 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
1ad40 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
1ad50 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1ad60 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1ad70 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
1ad80 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
1ad90 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
1ada0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
1adb0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1adc0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20  index;.    }..  
1add0 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
1ade0 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72  ndex names gener
1adf0 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ated from within
1ae00 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1ae10 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d  _vtab().    ** m
1ae20 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74  ust have names t
1ae30 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
1ae40 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74   from normal aut
1ae50 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
1ae60 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  es..    ** The f
1ae70 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
1ae80 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c  nt converts "sql
1ae90 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e  ite3_autoindex..
1aea0 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22  ." into.    ** "
1aeb0 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65  sqlite3_butoinde
1aec0 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74  x..." in order t
1aed0 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73  o make the names
1aee0 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a   distinct..    *
1aef0 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e  * The "vtab_err.
1af00 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e  test" test demon
1af10 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64  strates the need
1af20 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   of this stateme
1af30 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  nt. */.    if( I
1af40 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
1af50 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20  ) zName[7]++;.  
1af60 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
1af70 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
1af80 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
1af90 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
1afa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1afb0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
1afc0 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
1afd0 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  CT ){.    const 
1afe0 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
1aff0 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  >zDbSName;.    i
1b000 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1b010 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1b020 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
1b030 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
1b040 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1b050 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1b060 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1b070 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
1b080 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
1b090 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1b0a0 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
1b0b0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
1b0c0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1b0d0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1b0e0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
1b0f0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1b100 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1b110 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1b120 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
1b130 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1b140 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
1b150 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
1b160 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
1b170 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
1b180 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
1b190 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
1b1a0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
1b1b0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1b1c0 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
1b1d0 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
1b1e0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
1b1f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
1b200 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b  st==0 ){.    Tok
1b210 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20  en prevCol;.    
1b220 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26  Column *pCol = &
1b230 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
1b240 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43  >nCol-1];.    pC
1b250 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
1b260 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a  COLFLAG_UNIQUE;.
1b270 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
1b280 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70  Init(&prevCol, p
1b290 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
1b2a0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1b2b0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1b2c0 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
1b2d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b2e0 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
1b2f0 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29  ID, &prevCol, 0)
1b300 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1b310 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1b320 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b330 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1b340 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
1b350 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1b360 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69  SetSortOrder(pLi
1b370 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a  st, sortOrder);.
1b380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b390 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
1b3a0 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
1b3b0 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b  pList, "index");
1b3c0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1b3d0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
1b3e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b3f0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
1b400 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
1b410 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
1b420 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
1b430 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
1b440 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
1b450 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b460 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
1b470 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1b480 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1b490 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1b4a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1b4b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1b4c0 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  xpr!=0 );.    if
1b4d0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1b4e0 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1b4f0 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
1b500 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b510 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1b520 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1b530 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
1b540 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
1b550 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
1b560 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1b570 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
1b580 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
1b590 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
1b5a0 3a 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  : 1;.  assert( p
1b5b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
1b5c0 78 74 72 61 43 6f 6c 20 3c 3d 20 33 32 37 36 37  xtraCol <= 32767
1b5d0 20 2f 2a 20 46 69 74 73 20 69 6e 20 69 31 36 20   /* Fits in i16 
1b5e0 2a 2f 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  */ );.  pIndex =
1b5f0 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
1b600 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
1b610 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
1b620 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
1b660 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
1b670 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1b680 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1b690 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b6a0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1b6b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1b6c0 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
1b6d0 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20  iRowLogEst) );. 
1b6e0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1b6f0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
1b700 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b  ndex->azColl) );
1b710 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
1b720 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78   = zExtra;.  zEx
1b730 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31  tra += nName + 1
1b740 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
1b750 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
1b760 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
1b770 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
1b780 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  ab;.  pIndex->on
1b790 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
1b7a0 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75  ror;.  pIndex->u
1b7b0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  niqNotNull = onE
1b7c0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
1b7d0 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1b7e0 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49   = idxType;.  pI
1b7f0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
1b800 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1b810 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
1b820 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
1b830 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
1b840 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
1b850 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1b860 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1b870 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
1b880 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
1b890 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
1b8a0 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
1b8b0 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
1b8c0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
1b8d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1b8e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1b8f0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
1b900 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1b910 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
1b920 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
1b930 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
1b940 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1b950 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1b960 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
1b970 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
1b980 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
1b990 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
1b9a0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
1b9b0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
1b9c0 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
1b9d0 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
1b9e0 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
1b9f0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
1ba00 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
1ba10 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
1ba20 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
1ba30 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
1ba40 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
1ba50 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1ba60 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
1ba70 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
1ba80 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
1ba90 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
1baa0 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
1bab0 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
1bac0 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
1bad0 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
1bae0 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
1baf0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
1bb00 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
1bb10 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1bb20 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
1bb30 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
1bb40 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
1bb50 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
1bb60 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
1bb70 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
1bb80 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
1bb90 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
1bba0 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
1bbb0 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70  .  pListItem = p
1bbc0 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49  List->a;.  if( I
1bbd0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1bbe0 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  ){.    pIndex->a
1bbf0 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b  ColExpr = pList;
1bc00 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
1bc10 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1bc20 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
1bc30 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
1bc40 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1bc50 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  CExpr;          
1bc60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1bc70 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73  -th index expres
1bc80 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
1bc90 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1bca0 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53  er;        /* AS
1bcb0 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65  C or DESC on the
1bcc0 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e   i-th expression
1bcd0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
1bce0 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
1bcf0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1bd00 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1bd10 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
1bd20 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73  3StringToId(pLis
1bd30 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
1bd40 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1bd50 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
1bd60 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
1bd70 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74  IdxExpr, pListIt
1bd80 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  em->pExpr, 0);. 
1bd90 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1bda0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
1bdb0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1bdc0 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74    pCExpr = sqlit
1bdd0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1bde0 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  e(pListItem->pEx
1bdf0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45  pr);.    if( pCE
1be00 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1be10 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
1be20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1be30 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  ewTable ){.     
1be40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1be50 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72  sg(pParse, "expr
1be60 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74  essions prohibit
1be70 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45  ed in PRIMARY KE
1be80 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20  Y and ".        
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bea0 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20          "UNIQUE 
1beb0 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
1bec0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1bed0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1bee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1bef0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1bf00 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1bf10 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1bf20 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
1bf30 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    pList = 0;.   
1bf40 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58     }.      j = X
1bf50 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1bf60 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1bf70 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
1bf80 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1bf90 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1bfa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d  }else{.      j =
1bfb0 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   pCExpr->iColumn
1bfc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bfd0 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20  j<=0x7fff );.   
1bfe0 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
1bff0 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e        j = pTab->
1c000 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  iPKey;.      }el
1c010 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
1c020 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
1c030 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1c040 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1c050 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c060 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1c070 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a  mn[i] = (i16)j;.
1c080 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20      }.    zColl 
1c090 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = 0;.    if( pLi
1c0a0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f  stItem->pExpr->o
1c0b0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
1c0c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c  .      int nColl
1c0d0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
1c0e0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1c0f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1c100 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
1c110 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
1c120 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
1c130 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
1c140 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
1c150 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
1c160 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
1c170 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
1c180 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
1c190 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
1c1a0 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
1c1b0 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20   }else if( j>=0 
1c1c0 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  ){.      zColl =
1c1d0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1c1e0 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
1c1f0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f  if( !zColl ) zCo
1c200 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  ll = sqlite3StrB
1c210 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21  INARY;.    if( !
1c220 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
1c230 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
1c240 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
1c250 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
1c260 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c270 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1c280 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1c290 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
1c2a0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1c2b0 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
1c2c0 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
1c2d0 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
1c2e0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1c2f0 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
1c300 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
1c310 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
1c320 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f  the table key to
1c330 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1c340 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48  index.  For WITH
1c350 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74  OUT ROWID.  ** t
1c360 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21  ables (when pPk!
1c370 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1c380 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52   the declared PR
1c390 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a  IMARY KEY.  For.
1c3a0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c    ** normal tabl
1c3b0 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29  es (when pPk==0)
1c3c0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
1c3d0 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20  e rowid..  */.  
1c3e0 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
1c3f0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
1c400 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
1c410 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
1c420 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1c430 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
1c440 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61   );.      if( ha
1c450 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e  sColumn(pIndex->
1c460 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78  aiColumn, pIndex
1c470 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b  ->nKeyCol, x) ){
1c480 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1c490 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20  >nColumn--; .   
1c4a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c4b0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1c4c0 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20  mn[i] = x;.     
1c4d0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1c4e0 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[i] = pPk->azCo
1c4f0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  ll[j];.        p
1c500 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1c510 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72  r[i] = pPk->aSor
1c520 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1c530 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
1c540 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c550 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  ( i==pIndex->nCo
1c560 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  lumn );.  }else{
1c570 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
1c580 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f  olumn[i] = XN_RO
1c590 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  WID;.    pIndex-
1c5a0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  >azColl[i] = sql
1c5b0 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1c5c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
1c5d0 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
1c5e0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1c5f0 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20  >pNewTable==0 ) 
1c600 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
1c610 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  th(pIndex);..  /
1c620 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1c630 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63  contains every c
1c640 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62  olumn of its tab
1c650 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20  le, then mark.  
1c660 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72  ** it as a cover
1c670 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  ing index */.  a
1c680 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28  ssert( HasRowid(
1c690 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20  pTab) .      || 
1c6a0 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
1c6b0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1c6c0 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54  Index(pIndex, pT
1c6d0 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b  ab->iPKey)>=0 );
1c6e0 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75  .  recomputeColu
1c6f0 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49  mnsNotIndexed(pI
1c700 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62  ndex);.  if( pTb
1c710 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64  lName!=0 && pInd
1c720 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61  ex->nColumn>=pTa
1c730 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70  b->nCol ){.    p
1c740 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1c750 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  g = 1;.    for(j
1c760 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1c770 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1c780 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
1c790 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c7a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1c7b0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1c7c0 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69  ex,j)>=0 ) conti
1c7d0 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  nue;.      pInde
1c7e0 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1c7f0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1c800 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1c810 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
1c820 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
1c830 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1c840 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
1c850 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
1c860 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
1c870 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
1c880 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
1c890 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1c8a0 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
1c8b0 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
1c8c0 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
1c8d0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1c8e0 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
1c8f0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1c900 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
1c910 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
1c920 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1c930 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
1c940 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
1c950 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
1c960 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
1c970 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
1c980 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
1c990 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1c9a0 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
1c9b0 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
1c9c0 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
1c9d0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
1c9e0 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
1c9f0 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
1ca00 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
1ca10 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1ca20 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
1ca30 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
1ca40 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
1ca50 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
1ca60 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1ca70 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20  * Two UNIQUE or 
1ca80 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1ca90 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73  traints are cons
1caa0 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e  idered equivalen
1cab0 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68  t.    ** (and th
1cac0 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74  us suppressing t
1cad0 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65  he second one) e
1cae0 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65  ven if they have
1caf0 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a   different.    *
1cb00 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20  * sort orders.. 
1cb10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1cb20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1cb30 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
1cb40 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68  quences or if th
1cb50 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  e columns of.   
1cb60 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69   ** the constrai
1cb70 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66  nt occur in diff
1cb80 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68  erent orders, th
1cb90 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
1cba0 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f  ts are.    ** co
1cbb0 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63  nsidered distinc
1cbc0 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c  t and both resul
1cbd0 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e  t in separate in
1cbe0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
1cbf0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1cc00 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1cc10 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1cc20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1cc30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
1cc40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1cc50 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1cc60 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1cc70 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65  t( pIdx->idxType
1cc80 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1cc90 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20  _APPDEF );.     
1cca0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1ccb0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
1ccc0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
1ccd0 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64  x->nKeyCol!=pInd
1cce0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  ex->nKeyCol ) co
1ccf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
1cd00 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
1cd10 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20  KeyCol; k++){.  
1cd20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1cd30 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   *z1;.        co
1cd40 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1cd50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1cd60 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e  dx->aiColumn[k]>
1cd70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1cd80 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1cd90 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
1cda0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
1cdb0 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
1cdc0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
1cdd0 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
1cde0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
1cdf0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1ce00 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1ce10 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1ce20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1ce30 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1ce40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1ce50 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1ce60 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1ce70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1ce80 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1ce90 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1cea0 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1ceb0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1cec0 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1ced0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1cee0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1cef0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1cf00 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1cf10 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1cf20 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1cf30 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1cf40 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1cf50 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1cf60 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1cf70 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1cf80 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1cf90 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1cfa0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1cfb0 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1cfc0 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1cfd0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1cfe0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1cff0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1d000 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1d010 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1d020 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1d030 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1d040 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1d050 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1d060 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1d070 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d080 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d090 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1d0a0 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1d0b0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1d0c0 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1d0d0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1d0e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1d0f0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1d100 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1d110 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1d120 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1d130 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1d140 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1d150 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70        if( idxTyp
1d160 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
1d170 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70  E_PRIMARYKEY ) p
1d180 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69  Idx->idxType = i
1d190 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  dxType;.        
1d1a0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1d1b0 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
1d1c0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1d1d0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e  = pParse->pNewIn
1d1e0 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  dex;.          p
1d1f0 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1d200 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20   = pIndex;.     
1d210 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1d220 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d230 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1d240 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1d250 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d260 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
1d270 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a  BJECT ){..    /*
1d280 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
1d290 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
1d2a0 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
1d2b0 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20  o the other.    
1d2c0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
1d2d0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
1d2e0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  . .    */.    as
1d2f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1d300 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  rr==0 );.    if(
1d310 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1d320 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1d330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d340 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
1d350 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
1d360 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1d370 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
1d380 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1d390 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1d3a0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1d3b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1d3c0 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1d3d0 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 69  wTnum;.        i
1d3e0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 48  f( sqlite3IndexH
1d3f0 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f 74 50  asDuplicateRootP
1d400 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b 0a 20  age(pIndex) ){. 
1d410 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d420 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d430 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61   "invalid rootpa
1d440 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge");.          
1d450 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1d460 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d470 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1d480 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1d490 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ex;.        }.  
1d4a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20      }.      p = 
1d4b0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1d4c0 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
1d4d0 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
1d4e0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1d4f0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a  zName, pIndex);.
1d500 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20        if( p ){. 
1d510 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d520 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
1d530 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
1d540 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
1d550 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
1d560 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  lt(db);.        
1d570 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1d580 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1d590 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61        db->mDbFla
1d5a0 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
1d5b0 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d  emaChange;.    }
1d5c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1d5d0 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1d5e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1d5f0 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
1d600 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1d610 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61     ** index is a
1d620 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
1d630 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
1d640 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1d650 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20  traint) then.   
1d660 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f   ** emit code to
1d670 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   allocate the in
1d680 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20  dex rootpage on 
1d690 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e  disk and make an
1d6a0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a   entry for.    *
1d6b0 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74  * the index in t
1d6c0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1d6d0 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c   table and popul
1d6e0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ate the index wi
1d6f0 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  th.    ** conten
1d700 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20  t.  But, do not 
1d710 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72  do this if we ar
1d720 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67  e simply reading
1d730 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1d740 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  er.    ** table 
1d750 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
1d760 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
1d770 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
1d780 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
1d790 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f     ** of a WITHO
1d7a0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1d7b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1d7c0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1d7d0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1d7e0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1d7f0 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1d800 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f  ARY KEY.    ** o
1d810 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
1d820 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1d830 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
1d840 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  ce the table.   
1d850 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
1d860 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
1d870 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
1d880 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
1d890 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
1d8a0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
1d8b0 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
1d8c0 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52     else if( HasR
1d8d0 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54  owid(pTab) || pT
1d8e0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1d8f0 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
1d900 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1d910 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
1d920 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1d930 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
1d940 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1d950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d  );.      if( v==
1d960 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1d970 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1d980 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1d990 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1d9a0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
1d9b0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
1d9c0 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
1d9d0 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
1d9e0 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75   CreateIndex. Bu
1d9f0 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  t before.      *
1da00 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1da10 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1da20 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1da30 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1da40 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75      ** Index.tnu
1da50 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  m. This is requi
1da60 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
1da70 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c   index is actual
1da80 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50  ly a .      ** P
1da90 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74  RIMARY KEY and t
1daa0 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75  he table is actu
1dab0 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52  ally a WITHOUT R
1dac0 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a  OWID table. In .
1dad0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61        ** that ca
1dae0 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f  se the convertTo
1daf0 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
1db00 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  e() routine will
1db10 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a   replace.      *
1db20 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20  * the Noop with 
1db30 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f  a Goto to jump o
1db40 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64  ver the VDBE cod
1db50 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f  e generated belo
1db60 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64  w. */.      pInd
1db70 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1db80 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1db90 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20  OP_Noop);.      
1dba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dbb0 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74  3(v, OP_CreateBt
1dbc0 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20  ree, iDb, iMem, 
1dbd0 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
1dbe0 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72  .      /* Gather
1dbf0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
1dc00 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
1dc10 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1dc20 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
1dc30 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
1dc40 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
1dc50 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1dc60 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28         int n = (
1dc70 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61  int)(pParse->sLa
1dc80 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d  stToken.z - pNam
1dc90 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  e->z) + pParse->
1dca0 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
1dcb0 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
1dcc0 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
1dcd0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  --;.        /* A
1dce0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1dcf0 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1dd00 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1dd10 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
1dd20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1dd30 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1dd40 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1dd50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  ,.            on
1dd60 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
1dd70 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
1dd80 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20   n, pName->z);. 
1dd90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dda0 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
1ddb0 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
1ddc0 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
1ddd0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
1dde0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
1ddf0 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
1de00 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
1de10 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74  ; */.        zSt
1de20 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1de30 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  .      /* Add an
1de40 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1de50 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1de60 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a   index.      */.
1de70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
1de80 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1de90 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53   .          "INS
1dea0 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1deb0 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1dec0 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1ded0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1dee0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1def0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
1df00 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1df10 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
1df20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
1df30 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
1df40 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1df50 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1df60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1df70 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  , zStmt);..     
1df80 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1df90 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1dfa0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1dfb0 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1dfc0 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20  Expire.      ** 
1dfd0 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
1dfe0 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
1dff0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
1e000 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54   */.      if( pT
1e010 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1e020 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1e030 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1e040 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
1e050 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1e060 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1e070 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
1e080 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1e090 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65  eSchemaOp(pParse
1e0a0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
1e0b0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
1e0c0 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
1e0d0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1e0e0 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
1e0f0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e));.        sql
1e100 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e110 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20  , OP_Expire, 0, 
1e120 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
1e130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1e140 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78  mpHere(v, pIndex
1e150 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20  ->tnum);.    }. 
1e160 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
1e170 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
1e180 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
1e190 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
1e1a0 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
1e1b0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
1e1c0 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
1e1d0 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
1e1e0 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
1e1f0 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
1e200 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1e210 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
1e220 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
1e230 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
1e240 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65   (in sqlite3Gene
1e250 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
1e260 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20  ecks()) as part 
1e270 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61  of.  ** UPDATE a
1e280 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  nd INSERT statem
1e290 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  ents.  .  */.  i
1e2a0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1e2b0 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
1e2c0 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
1e2d0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
1e2e0 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
1e2f0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
1e300 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
1e310 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
1e320 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1e330 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
1e340 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
1e350 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1e360 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
1e370 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
1e380 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
1e390 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1e3a0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
1e3b0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
1e3c0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1e3d0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
1e3e0 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
1e3f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1e400 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1e410 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
1e420 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
1e430 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
1e440 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1e450 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  x = 0;.  }.  els
1e460 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f  e if( IN_RENAME_
1e470 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73  OBJECT ){.    as
1e480 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
1e490 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20  ewIndex==0 );.  
1e4a0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e    pParse->pNewIn
1e4b0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1e4c0 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1e4d0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
1e4e0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
1e4f0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
1e500 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
1e510 65 78 20 29 20 73 71 6c 69 74 65 33 46 72 65 65  ex ) sqlite3Free
1e520 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1e530 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1e540 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1e550 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1e560 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1e570 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1e580 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1e590 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1e5a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e5b0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, zName);.}../
1e5c0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
1e5d0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
1e5e0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
1e5f0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
1e600 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
1e610 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
1e620 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
1e630 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1e640 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
1e650 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
1e660 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
1e670 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1e680 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1e690 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
1e6a0 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
1e6b0 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
1e6c0 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
1e6d0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
1e6e0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
1e6f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
1e700 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
1e710 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
1e720 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
1e730 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1e740 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
1e750 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1e760 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
1e770 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
1e780 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1e790 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  r combination of
1e7a0 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
1e7b0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
1e7c0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
1e7d0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
1e7e0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
1e7f0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
1e800 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1e810 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
1e820 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1e830 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
1e840 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
1e850 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
1e860 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
1e870 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
1e880 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
1e890 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
1e8a0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
1e8b0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
1e8c0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
1e8d0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
1e8e0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
1e8f0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
1e900 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1e910 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
1e920 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20  ex *pIdx){.  /* 
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1e940 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20  0,  9,  8,  7,  
1e950 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56  6 */.  LogEst aV
1e960 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c  al[] = { 33, 32,
1e970 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20   30, 28, 26 };. 
1e980 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64   LogEst *a = pId
1e990 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a  x->aiRowLogEst;.
1e9a0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49    int nCopy = MI
1e9b0 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c  N(ArraySize(aVal
1e9c0 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  ), pIdx->nKeyCol
1e9d0 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  );.  int i;..  /
1e9e0 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64  * Indexes with d
1e9f0 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d  efault row estim
1ea00 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ates should not 
1ea10 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20  have stat1 data 
1ea20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49  */.  assert( !pI
1ea30 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a  dx->hasStat1 );.
1ea40 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
1ea50 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65  rst entry (numbe
1ea60 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1ea70 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65   index) to the e
1ea80 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e  stimated .  ** n
1ea90 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1eaa0 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68   the table, or h
1eab0 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  alf the number o
1eac0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1ead0 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70  ble.  ** for a p
1eae0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20  artial index.   
1eaf0 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  But do not let t
1eb00 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70  he estimate drop
1eb10 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20   below 10. */.  
1eb20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1eb30 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1eb40 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61  .  if( pIdx->pPa
1eb50 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
1eb60 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73  a[0] -= 10;  ass
1eb70 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
1eb80 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69  LogEst(2) );.  i
1eb90 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1eba0 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20  ] = 33;         
1ebb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ebc0 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1ebd0 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1ebe0 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1ebf0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1ec00 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1ec10 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1ec20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1ec30 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1ec40 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1ec50 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1ec60 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1ec70 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1ec80 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1ec90 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1eca0 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1ecb0 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ecd0 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1ece0 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1ecf0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1ed00 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1ed10 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1ed20 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1ed30 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1ed40 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1ed50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1ed60 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1ed70 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1ed80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1ed90 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1eda0 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1edb0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1edc0 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1edd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1ede0 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1edf0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1ee00 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1ee10 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1ee20 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ee30 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1ee40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1ee50 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1ee60 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1ee70 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1ee80 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1ee90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1eea0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1eeb0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1eec0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1eed0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1eee0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1eef0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1ef00 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1ef10 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ef20 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1ef30 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1ef40 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1ef50 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1ef60 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1ef70 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1ef80 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1ef90 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1efa0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1efb0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1efc0 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1efd0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1efe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1eff0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1f000 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1f010 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1f020 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1f030 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1f040 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1f050 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1f060 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1f070 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1f080 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1f090 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1f0a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f0b0 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1f0c0 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1f0d0 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1f0e0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1f0f0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1f100 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1f110 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1f120 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1f130 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1f140 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1f150 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
1f160 69 74 65 33 53 63 68 65 6d 61 57 72 69 74 61 62  ite3SchemaWritab
1f170 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
1f180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f190 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1f1a0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
1f1b0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1f1c0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
1f1d0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
1f1e0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
1f1f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1f200 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1f210 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
1f220 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
1f230 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
1f240 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f250 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f260 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
1f270 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
1f280 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1f290 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1f2a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
1f2b0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1f2c0 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
1f2d0 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
1f2e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f2f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f300 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
1f310 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
1f320 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
1f330 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1f340 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1f350 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f360 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1f370 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
1f380 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
1f390 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
1f3a0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1f3b0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1f3c0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1f3d0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1f3e0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
1f3f0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1f400 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
1f410 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
1f420 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
1f430 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41   WHERE name=%Q A
1f440 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1f450 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
1f460 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1f470 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e  MASTER_NAME, pIn
1f480 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1f490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1f4a0 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1f4b0 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1f4c0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1f4d0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1f4e0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1f4f0 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1f500 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1f510 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1f520 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1f530 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f540 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1f550 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1f560 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1f570 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1f580 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1f590 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1f5a0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1f5b0 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1f5c0 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1f5d0 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1f5e0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1f5f0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1f600 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1f610 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1f620 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1f630 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1f640 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1f650 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1f660 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1f670 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1f680 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1f690 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f6a0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1f6b0 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1f6c0 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1f6d0 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1f6e0 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1f6f0 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1f700 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1f710 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1f720 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1f730 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1f740 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1f750 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1f760 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1f770 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1f780 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1f790 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1f7a0 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1f7b0 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1f7c0 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1f7d0 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1f7e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f7f0 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1f800 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1f810 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1f820 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1f830 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1f840 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1f850 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1f860 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1f870 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1f880 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1f890 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1f8a0 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1f8b0 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1f8c0 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1f8d0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1f8e0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1f8f0 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1f900 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1f910 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1f920 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1f930 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1f940 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1f950 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1f960 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1f970 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1f980 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1f990 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1f9a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1f9b0 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1f9c0 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1f9d0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1f9e0 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1f9f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1fa00 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1fa10 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1fa20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c    char *z;.  sql
1fa30 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20 2a  ite3_int64 n = *
1fa40 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  pIdx = *pnEntry;
1fa50 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1fa60 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))==0 ){.    sql
1fa70 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20  ite3_int64 sz = 
1fa80 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e  (n==0) ? 1 : 2*n
1fa90 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  ;.    void *pNew
1faa0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1fab0 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
1fac0 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  sz*szEntry);.   
1fad0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1fae0 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
1faf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1fb00 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
1fb10 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a   pArray = pNew;.
1fb20 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a    }.  z = (char*
1fb30 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  )pArray;.  memse
1fb40 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79  t(&z[n * szEntry
1fb50 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
1fb60 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
1fb70 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
1fb80 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1fb90 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1fba0 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
1fbb0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1fbc0 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
1fbd0 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
1fbe0 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
1fbf0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1fc00 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1fc10 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
1fc20 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
1fc30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
1fc40 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
1fc50 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1fc60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1fc70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1fc80 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1fc90 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1fca0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1fcb0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1fcc0 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
1fcd0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1fce0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1fcf0 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
1fd00 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1fd10 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
1fd20 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
1fd30 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1fd40 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
1fd50 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
1fd60 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
1fd70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
1fd80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1fd90 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1fda0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1fdb0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1fdc0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1fdd0 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
1fde0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1fdf0 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 2d  OBJECT && pList-
1fe00 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
1fe10 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
1fe20 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
1fe30 20 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61   (void*)pList->a
1fe40 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65  [i].zName, pToke
1fe50 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
1fe60 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1fe70 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
1fe80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1fe90 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73  e3IdListDelete(s
1fea0 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1feb0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1fec0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1fed0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1fee0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1fef0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1ff00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ff10 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
1ff20 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
1ff30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ff40 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
1ff50 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
1ff60 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1ff70 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1ff80 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
1ff90 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
1ffa0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
1ffb0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
1ffc0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
1ffd0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
1ffe0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
1fff0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
20000 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
20010 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
20020 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
20030 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
20040 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
20050 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
20060 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
20070 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
20080 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
20090 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n -1;.}../*.** M
200a0 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
200b0 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e   SrcList object.
200c0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20  .** The SrcList 
200d0 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74  object is used t
200e0 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
200f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
20100 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
20110 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65 20 71 75  ment, and the qu
20120 65 72 79 20 70 6c 61 6e 6e 65 72 20 63 61 6e 6e  ery planner cann
20130 6f 74 20 64 65 61 6c 20 77 69 74 68 20 6d 6f 72  ot deal with mor
20140 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20 74 61 62  e.** than 64 tab
20150 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20  les in a join.  
20160 53 6f 20 61 6e 79 20 76 61 6c 75 65 20 6c 61 72  So any value lar
20170 67 65 72 20 74 68 61 6e 20 36 34 20 68 65 72 65  ger than 64 here
20180 0a 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e  .** is sufficien
20190 74 20 66 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e  t for most uses.
201a0 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73    Smaller values
201b0 2c 20 6c 69 6b 65 20 73 61 79 20 31 30 2c 20 61  , like say 10, a
201c0 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  re.** appropriat
201d0 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61 6e 64 20  e for small and 
201e0 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65 64 20 61  memory-limited a
201f0 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  pplications..*/.
20200 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
20210 41 58 5f 53 52 43 4c 49 53 54 0a 23 20 64 65 66  AX_SRCLIST.# def
20220 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
20230 52 43 4c 49 53 54 20 32 30 30 0a 23 65 6e 64 69  RCLIST 200.#endi
20240 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20  f../*.** Expand 
20250 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
20260 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  ted for the give
20270 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  n SrcList object
20280 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20   by.** creating 
20290 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73  nExtra new slots
202a0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   beginning at iS
202b0 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73  tart.  iStart is
202c0 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20   zero based..** 
202d0 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65  New slots are ze
202e0 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  roed..**.** For 
202f0 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65  example, suppose
20300 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69   a SrcList initi
20310 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77  ally contains tw
20320 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a  o entries: A,B..
20330 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e  ** To append 3 n
20340 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20  ew entries onto 
20350 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73  the end, do this
20360 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
20370 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
20380 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33  (db, pSrclist, 3
20390 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65  , 2);.**.** Afte
203a0 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  r the call above
203b0 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69   it would contai
203c0 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e  n:  A, B, nil, n
203d0 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74  il, nil..** If t
203e0 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65  he iStart argume
203f0 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e  nt had been 1 in
20400 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e  stead of 2, then
20410 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77   the result.** w
20420 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20  ould have been: 
20430 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   A, nil, nil, ni
20440 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e  l, B.  To prepen
20450 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c  d the new slots,
20460 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76  .** the iStart v
20470 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e  alue would be 0.
20480 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65    The result the
20490 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e  n would.** be: n
204a0 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c  il, nil, nil, A,
204b0 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d   B..**.** If a m
204c0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
204d0 20 66 61 69 6c 73 20 6f 72 20 74 68 65 20 53 72   fails or the Sr
204e0 63 4c 69 73 74 20 62 65 63 6f 6d 65 73 20 74 6f  cList becomes to
204f0 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76 65 0a 2a  o large, leave.*
20500 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  * the original S
20510 72 63 4c 69 73 74 20 75 6e 63 68 61 6e 67 65 64  rcList unchanged
20520 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20 61  , return NULL, a
20530 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
20540 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
20550 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c 69  pParse..*/.SrcLi
20560 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
20570 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 50 61 72  stEnlarge(.  Par
20580 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
20590 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
205a0 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 65 72  xt into which er
205b0 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65  rors are reporte
205c0 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  d */.  SrcList *
205d0 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
205e0 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
205f0 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
20600 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
20610 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
20620 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
20630 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
20640 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
20650 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
20660 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
20670 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
20680 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
20690 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
206a0 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
206b0 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
206c0 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
206d0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
206e0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
206f0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
20700 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
20710 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
20720 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
20730 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
20740 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28  eeded */.  if( (
20750 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  u32)pSrc->nSrc+n
20760 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
20770 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
20780 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 73 71 6c  t *pNew;.    sql
20790 69 74 65 33 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f  ite3_int64 nAllo
207a0 63 20 3d 20 32 2a 28 73 71 6c 69 74 65 33 5f 69  c = 2*(sqlite3_i
207b0 6e 74 36 34 29 70 53 72 63 2d 3e 6e 53 72 63 2b  nt64)pSrc->nSrc+
207c0 6e 45 78 74 72 61 3b 0a 20 20 20 20 73 71 6c 69  nExtra;.    sqli
207d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
207e0 2d 3e 64 62 3b 0a 0a 20 20 20 20 69 66 28 20 70  ->db;..    if( p
207f0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
20800 3e 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  >=SQLITE_MAX_SRC
20810 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 73 71  LIST ){.      sq
20820 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20830 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
20840 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
20850 73 2c 20 6d 61 78 3a 20 25 64 22 2c 0a 20 20 20  s, max: %d",.   
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52     SQLITE_MAX_SR
20880 43 4c 49 53 54 29 3b 0a 20 20 20 20 20 20 72 65  CLIST);.      re
20890 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
208a0 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3e 53 51 4c    if( nAlloc>SQL
208b0 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20  ITE_MAX_SRCLIST 
208c0 29 20 6e 41 6c 6c 6f 63 20 3d 20 53 51 4c 49 54  ) nAlloc = SQLIT
208d0 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 3b 0a 20  E_MAX_SRCLIST;. 
208e0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
208f0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
20900 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
20910 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63      sizeof(*pSrc
20920 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ) + (nAlloc-1)*s
20930 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
20940 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
20950 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  w==0 ){.      as
20960 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
20970 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
20980 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
20990 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
209a0 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
209b0 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a  c = nAlloc;.  }.
209c0 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
209d0 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
209e0 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
209f0 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
20a00 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
20a10 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
20a20 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
20a30 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
20a40 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
20a50 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
20a60 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
20a70 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
20a80 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
20a90 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
20aa0 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
20ab0 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
20ac0 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
20ad0 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
20ae0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
20af0 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
20b00 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
20b10 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
20b20 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
20b30 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
20b40 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
20b50 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
20b60 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
20b70 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
20b80 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
20b90 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
20ba0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
20bb0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
20bc0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
20bd0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
20be0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
20bf0 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
20c00 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
20c10 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
20c20 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
20c30 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
20c40 65 72 72 6f 72 20 6f 72 20 69 66 20 74 68 65 0a  error or if the.
20c50 2a 2a 20 53 72 63 4c 69 73 74 20 67 72 6f 77 73  ** SrcList grows
20c60 20 74 6f 20 6c 61 72 67 65 2e 20 20 54 68 65 20   to large.  The 
20c70 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
20c80 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
20c90 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
20ca0 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
20cb0 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
20cc0 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
20cd0 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
20ce0 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
20cf0 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
20d00 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
20d10 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
20d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20d30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
20d40 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
20d50 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
20d60 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
20d70 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
20d80 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
20d90 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
20da0 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
20db0 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
20dc0 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
20dd0 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
20de0 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
20df0 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
20e00 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
20e10 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
20e20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
20e30 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
20e40 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
20e50 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
20e60 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
20e70 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
20e80 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
20e90 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
20ea0 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
20eb0 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
20ec0 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
20ed0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
20ee0 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
20ef0 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
20f00 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
20f10 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
20f20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20f30 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
20f40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
20f50 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20f60 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
20f70 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
20f80 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
20f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
20fa0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
20fb0 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
20fc0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
20fd0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
20fe0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
20ff0 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
21000 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
21010 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
21020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
21030 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
21040 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
21050 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
21060 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
21070 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
21080 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
21090 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
210a0 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
210b0 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
210c0 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
210d0 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
210e0 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
210f0 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
21100 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
21110 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
21120 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
21130 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
21140 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
21150 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
21160 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2c 20 69  rsing context, i
21170 6e 20 77 68 69 63 68 20 65 72 72 6f 72 73 20 61  n which errors a
21180 72 65 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20  re reported */. 
21190 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
211a0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
211b0 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
211c0 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
211d0 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
211e0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
211f0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
21200 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
21210 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
21220 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
21230 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
21240 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21250 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
21260 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
21270 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
21280 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
21290 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
212a0 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
212b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
212c0 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
212d0 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
212e0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
212f0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
21300 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
21310 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
21320 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
21330 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  ->db, sizeof(Src
21340 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
21350 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
21360 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
21370 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
21380 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
21390 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
213a0 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
213b0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
213c0 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
213d0 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
213e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
213f0 72 63 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73  rcList *pNew = s
21400 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
21410 61 72 67 65 28 70 50 61 72 73 65 2c 20 70 4c 69  arge(pParse, pLi
21420 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53  st, 1, pList->nS
21430 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  rc);.    if( pNe
21440 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
21450 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
21460 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
21470 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
21480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21490 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
214a0 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20    }.  }.  pItem 
214b0 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
214c0 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
214d0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
214e0 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
214f0 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
21500 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
21510 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
21520 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
21530 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
21540 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
21550 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
21560 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
21570 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
21580 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  db, pTable);.  }
21590 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d  else{.    pItem-
215a0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
215b0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
215c0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , pTable);.    p
215d0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
215e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
215f0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
21600 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72  * Assign VdbeCur
21610 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  sor index number
21620 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
21630 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
21640 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
21650 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
21660 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21670 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
21680 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
21690 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
216a0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
216b0 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
216c0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
216d0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
216e0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
216f0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
21700 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
21710 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
21720 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
21730 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
21740 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
21750 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
21760 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
21770 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
21780 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
21790 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
217a0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
217b0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
217c0 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
217d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
217e0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
217f0 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
21800 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
21810 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
21820 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
21830 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  cListDelete(sqli
21840 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
21850 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
21860 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
21870 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21880 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
21890 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
218a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
218b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
218c0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
218d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
218e0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
218f0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
21900 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21910 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
21920 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21930 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41  ee(db, pItem->zA
21940 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
21950 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
21960 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62  edBy ) sqlite3Db
21970 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
21980 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
21990 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
219a0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71  g.isTabFunc ) sq
219b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
219c0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ete(db, pItem->u
219d0 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20  1.pFuncArg);.   
219e0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
219f0 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ble(db, pItem->p
21a00 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
21a10 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
21a20 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
21a30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
21a40 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
21a50 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
21a60 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
21a70 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73  e(db, pItem->pUs
21a80 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
21a90 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
21aa0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
21ab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
21ac0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
21ad0 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
21ae0 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
21af0 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
21b00 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
21b10 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
21b20 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
21b30 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
21b40 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
21b50 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
21b60 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
21b70 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
21b80 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
21b90 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
21ba0 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
21bb0 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
21bc0 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
21bd0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
21be0 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
21bf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
21c00 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
21c10 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
21c20 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
21c30 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
21c40 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
21c50 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
21c60 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69   term has an ali
21c70 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
21c80 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
21c90 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
21ca0 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
21cb0 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
21cc0 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
21cd0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
21ce0 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
21cf0 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
21d00 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
21d10 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
21d20 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
21d30 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
21d40 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
21d50 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
21d60 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
21d70 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
21d80 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
21d90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
21da0 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
21db0 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
21dc0 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
21dd0 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
21de0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
21df0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
21e00 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
21e10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
21e20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
21e30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
21e40 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
21e50 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
21e60 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
21e70 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
21e80 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
21e90 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
21ea0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
21eb0 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
21ec0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21ed0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
21ee0 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
21ef0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
21f00 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
21f10 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
21f20 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
21f30 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
21f40 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
21f50 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
21f60 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
21f70 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
21f80 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
21f90 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
21fa0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
21fb0 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
21fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21fd0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
21fe0 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
21ff0 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
22000 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
22010 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
22020 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
22030 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
22040 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
22050 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22060 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
22070 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
22080 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22090 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
220a0 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
220b0 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
220c0 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
220d0 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
220e0 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
220f0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
22100 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
22110 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
22120 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 54 61  d(pParse, p, pTa
22130 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
22140 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
22150 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
22160 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
22170 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63   assert( p->nSrc
22180 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  >0 );.  pItem = 
22190 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
221a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 61  ;.  assert( (pTa
221b0 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62  ble==0)==(pDatab
221c0 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  ase==0) );.  ass
221d0 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
221e0 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61 62 61 73  e==0 || pDatabas
221f0 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 49 4e  e!=0 );.  if( IN
22200 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26  _RENAME_OBJECT &
22210 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
22220 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  {.    Token *pTo
22230 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53 28 70 44  ken = (ALWAYS(pD
22240 61 74 61 62 61 73 65 29 20 26 26 20 70 44 61 74  atabase) && pDat
22250 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74  abase->z) ? pDat
22260 61 62 61 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a  abase : pTable;.
22270 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
22280 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
22290 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
222a0 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  pToken);.  }.  a
222b0 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30  ssert( pAlias!=0
222c0 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73   );.  if( pAlias
222d0 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
222e0 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
222f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
22300 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
22310 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
22320 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
22330 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
22340 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
22350 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
22360 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e  eturn p;.. appen
22370 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  d_from_error:.  
22380 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
22390 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
223a0 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20  ete(db, pOn);.  
223b0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
223c0 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b  ete(db, pUsing);
223d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
223e0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
223f0 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  uery);.  return 
22400 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
22410 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72  an INDEXED BY or
22420 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
22430 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  use to the most 
22440 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a  recently added .
22450 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ** element of th
22460 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61  e source-list pa
22470 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
22480 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
22490 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
224a0 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72  istIndexedBy(Par
224b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
224c0 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70  ist *p, Token *p
224d0 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73  IndexedBy){.  as
224e0 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79  sert( pIndexedBy
224f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26  !=0 );.  if( p &
22500 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e  & pIndexedBy->n>
22510 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
22520 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
22530 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
22540 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
22550 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
22560 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
22570 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
22580 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
22590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
225a0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
225b0 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
225c0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
225d0 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
225e0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
225f0 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
22600 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
22610 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
22620 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
22630 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
22640 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
22650 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
22660 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
22670 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
22680 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
22690 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
226a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
226b0 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
226c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
226d0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
226e0 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
226f0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
22700 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 31  .isIndexedBy = 1
22710 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
22720 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73  *.** Add the lis
22730 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
22740 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53  guments to the S
22750 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72  rcList entry for
22760 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75   a.** table-valu
22770 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed-function..*/.
22780 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
22790 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73  istFuncArgs(Pars
227a0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
227b0 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  st *p, ExprList 
227c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
227d0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
227e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
227f0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
22800 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
22810 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74  t( pItem->fg.not
22820 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
22830 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
22840 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d  >fg.isIndexedBy=
22850 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
22860 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
22870 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
22880 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
22890 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  rg = pList;.    
228a0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
228b0 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  unc = 1;.  }else
228c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
228d0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
228e0 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
228f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
22900 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
22910 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
22920 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
22930 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
22940 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
22950 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
22960 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
22970 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
22980 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
22990 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
229a0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
229b0 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
229c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
229d0 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
229e0 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
229f0 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
22a00 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
22a10 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
22a20 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
22a30 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
22a40 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
22a50 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
22a60 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
22a70 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
22a80 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
22a90 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
22aa0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
22ab0 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
22ac0 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
22ad0 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
22ae0 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
22af0 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
22b00 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
22b10 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
22b20 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
22b30 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
22b40 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
22b50 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
22b60 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
22b70 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
22b80 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
22b90 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31   for(i=p->nSrc-1
22ba0 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
22bb0 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f     p->a[i].fg.jo
22bc0 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
22bd0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  1].fg.jointype;.
22be0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
22bf0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
22c00 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
22c10 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
22c20 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73  de for a BEGIN s
22c30 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
22c40 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
22c50 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
22c60 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
22c70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
22c80 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
22c90 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
22ca0 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
22cb0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
22cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
22cd0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
22ce0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
22cf0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
22d00 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
22d10 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
22d20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
22d30 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
22d40 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
22d50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
22d60 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
22d70 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
22d80 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
22d90 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
22da0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22db0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
22dc0 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
22dd0 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
22de0 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
22df0 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
22e00 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
22e10 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
22e20 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a  _AutoCommit);.}.
22e30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
22e40 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
22e50 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
22e60 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CK statement..**
22e70 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41   Code for ROLLBA
22e80 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  CK is generated 
22e90 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c  if eType==TK_ROL
22ea0 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77 69 73  LBACK.  Otherwis
22eb0 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e  e.** code is gen
22ec0 65 72 61 74 65 64 20 66 6f 72 20 61 20 43 4f 4d  erated for a COM
22ed0 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  MIT..*/.void sql
22ee0 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74 69  ite3EndTransacti
22ef0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
22f00 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20  , int eType){.  
22f10 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
22f20 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73  sRollback;..  as
22f30 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
22f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
22f50 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
22f60 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 54  assert( eType==T
22f70 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70  K_COMMIT || eTyp
22f80 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79  e==TK_END || eTy
22f90 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20  pe==TK_ROLLBACK 
22fa0 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20  );.  isRollback 
22fb0 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  = eType==TK_ROLL
22fc0 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69  BACK;.  if( sqli
22fd0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
22fe0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
22ff0 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20  SACTION, .      
23000 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52   isRollback ? "R
23010 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d  OLLBACK" : "COMM
23020 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
23030 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
23040 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
23050 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
23060 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
23070 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23080 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
23090 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20  , isRollback);. 
230a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
230b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
230c0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
230d0 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
230e0 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
230f0 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
23100 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
23110 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
23120 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
23130 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
23140 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
23150 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
23160 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
23170 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23180 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
23190 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
231a0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
231b0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
231c0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
231d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
231e0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
231f0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
23200 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
23210 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
23220 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
23230 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
23240 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
23250 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
23260 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
23270 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
23280 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
23290 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
232a0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
232b0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
232c0 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
232d0 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
232e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
232f0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
23300 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
23310 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
23320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
23330 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
23340 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
23350 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
23360 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
23370 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
23380 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
23390 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
233a0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
233b0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
233c0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
233d0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
233e0 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
233f0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
23400 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
23410 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
23420 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
23430 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
23440 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
23450 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
23460 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
23470 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
23480 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
23490 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
234a0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
234b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
234c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
234d0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
234e0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
234f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
23500 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
23510 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
23520 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
23530 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
23540 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
23550 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
23560 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
23570 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
23580 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
23590 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
235a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
235b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
235c0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
235d0 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
235e0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
235f0 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
23600 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
23610 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
23620 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
23630 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
23640 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
23650 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
23660 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
23670 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
23680 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
23690 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
236a0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
236b0 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
236c0 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
236d0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
236e0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
236f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23700 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
23710 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
23720 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
23730 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
23740 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
23750 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
23760 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
23770 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
23780 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
23790 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
237a0 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
237b0 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
237c0 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
237d0 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
237e0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
237f0 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
23800 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
23810 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
23820 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
23830 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
23840 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
23850 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
23860 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
23870 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 61 73  l(pParse);..  as
23880 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
23890 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
238a0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
238b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
238c0 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
238d0 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  iDb==1 );.  asse
238e0 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
238f0 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
23900 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23910 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
23920 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 69 44  d(pParse->db, iD
23930 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44  b, 0) );.  if( D
23940 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65  bMaskTest(pTople
23950 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
23960 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20   iDb)==0 ){.    
23970 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
23980 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
23990 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
239a0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
239b0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db==1 ){.      s
239c0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
239d0 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c  tabase(pToplevel
239e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
239f0 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
23a00 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74  t zDb is NULL, t
23a10 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
23a20 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
23a30 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  () for each .** 
23a40 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
23a50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  e. Otherwise, in
23a60 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20  voke it for the 
23a70 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a  database named z
23a80 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  Db only..*/.void
23a90 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23aa0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61  fyNamedSchema(Pa
23ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
23ac0 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
23ad0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23ae0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
23af0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
23b00 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
23b10 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
23b20 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
23b30 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28  f( pDb->pBt && (
23b40 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  !zDb || 0==sqlit
23b50 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70  e3StrICmp(zDb, p
23b60 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29  Db->zDbSName)) )
23b70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
23b80 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
23b90 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
23ba0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
23bb0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
23bc0 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
23bd0 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
23be0 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
23bf0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
23c00 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
23c10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
23c20 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
23c30 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
23c40 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
23c50 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
23c60 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
23c70 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
23c80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
23c90 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
23ca0 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
23cb0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
23cc0 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
23cd0 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
23ce0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
23cf0 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
23d00 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
23d10 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
23d20 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
23d30 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
23d40 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
23d50 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
23d60 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
23d70 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
23d80 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
23d90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
23da0 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
23db0 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
23dc0 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
23dd0 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
23de0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
23df0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
23e00 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
23e10 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
23e20 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
23e30 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
23e40 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
23e50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23e60 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
23e70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
23e80 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
23e90 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
23ea0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
23eb0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
23ec0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
23ed0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
23ee0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
23ef0 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61  se, iDb);.  DbMa
23f00 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d  skSet(pToplevel-
23f10 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29  >writeMask, iDb)
23f20 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
23f30 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73  sMultiWrite |= s
23f40 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a  etStatement;.}..
23f50 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
23f60 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
23f70 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  t currently unde
23f80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d  r construction m
23f90 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f  ight write.** mo
23fa0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72  re than one entr
23fb0 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65  y (example: dele
23fc0 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65  ting one row the
23fd0 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74  n inserting anot
23fe0 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e  her,.** insertin
23ff0 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  g multiple rows 
24000 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69  in a table, or i
24010 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61  nserting a row a
24020 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
24030 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72  .).** If an abor
24040 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73  t occurs after s
24050 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69  ome of these wri
24060 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74  tes have complet
24070 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ed, then it will
24080 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
24090 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d   to undo the com
240a0 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a  pleted writes..*
240b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75  /.void sqlite3Mu
240c0 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a  ltiWrite(Parse *
240d0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
240e0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
240f0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
24100 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
24110 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
24120 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Write = 1;.}../*
24130 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65   .** The code ge
24140 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68  nerator calls th
24150 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73  is routine if is
24160 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
24170 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  it is.** possibl
24180 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61  e to abort a sta
24190 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20  tement prior to 
241a0 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20  completion.  In 
241b0 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72  order to .** per
241c0 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20  form this abort 
241d0 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69  without corrupti
241e0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
241f0 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
24200 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68  .** sure that th
24210 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  e statement is p
24220 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74  rotected by a st
24230 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
24240 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e  ion..**.** Techn
24250 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20  ically, we only 
24260 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  need to set the 
24270 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66  mayAbort flag if
24280 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57   the.** isMultiW
24290 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72  rite flag was pr
242a0 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54  eviously set.  T
242b0 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64  here is a time d
242c0 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63  ependency.** suc
242d0 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74  h that the abort
242e0 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65   must occur afte
242f0 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65  r the multiwrite
24300 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a  .  This makes.**
24310 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73   some statements
24320 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52   involving the R
24330 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
24340 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
24350 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74  ithm.** go a lit
24360 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74  tle faster.  But
24370 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67   taking advantag
24380 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64  e of this time d
24390 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b  ependency.** mak
243a0 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69  es it more diffi
243b0 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68  cult to prove th
243c0 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63  at the code is c
243d0 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70  orrect (in .** p
243e0 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72  articular, it pr
243f0 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77  events us from w
24400 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74  riting an effect
24410 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ive.** implement
24420 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ation of sqlite3
24430 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
24440 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65  ) and so we have
24450 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61   chosen.** to ta
24460 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74  ke the safe rout
24470 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f  e and skip the o
24480 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a  ptimization..*/.
24490 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41  void sqlite3MayA
244a0 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72  bort(Parse *pPar
244b0 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
244c0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
244d0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
244e0 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
244f0 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20  vel->mayAbort = 
24500 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  1;.}../*.** Code
24510 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74   an OP_Halt that
24520 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65   causes the vdbe
24530 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51   to return an SQ
24540 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a  LITE_CONSTRAINT.
24550 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e  ** error. The on
24560 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20  Error parameter 
24570 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
24580 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65   (if any) of the
24590 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
245a0 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61  d/or current tra
245b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
245c0 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ed back..*/.void
245d0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
245e0 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
245f0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
24600 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24610 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  /.  int errCode,
24620 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65        /* extende
24630 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  d error code */.
24640 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
24650 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
24660 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  t type */.  char
24670 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a   *p4,         /*
24680 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
24690 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20  /.  i8 p4type,  
246a0 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54        /* P4_STAT
246b0 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45  IC or P4_TRANSIE
246c0 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72  NT */.  u8 p5Err
246d0 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f  msg       /* P5_
246e0 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29  ErrMsg type */.)
246f0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
24700 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
24710 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
24720 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  (errCode&0xff)==
24730 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
24740 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  T );.  if( onErr
24750 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  or==OE_Abort ){.
24760 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
24770 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
24780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
24790 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
247a0 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f   errCode, onErro
247b0 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
247c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
247d0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72  ChangeP5(v, p5Er
247e0 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rmsg);.}../*.** 
247f0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
24800 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72  due to UNIQUE or
24810 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
24820 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
24830 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
24840 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69  e3UniqueConstrai
24850 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
24860 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
24870 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
24880 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
24890 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
248a0 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  type */.  Index 
248b0 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54  *pIdx       /* T
248c0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72  he index that tr
248d0 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74  iggers the const
248e0 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  raint */.){.  ch
248f0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20  ar *zErr;.  int 
24900 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72  j;.  StrAccum er
24910 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70  rMsg;.  Table *p
24920 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
24930 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74  le;..  sqlite3St
24940 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d  rAccumInit(&errM
24950 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20  sg, pParse->db, 
24960 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
24980 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
24990 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
249a0 47 54 48 5d 29 3b 0a 20 20 69 66 28 20 70 49 64  GTH]);.  if( pId
249b0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
249c0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
249d0 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20  ppendf(&errMsg, 
249e0 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49  "index '%q'", pI
249f0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  dx->zName);.  }e
24a00 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  lse{.    for(j=0
24a10 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
24a20 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; j++){.      c
24a30 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
24a40 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
24a50 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
24a60 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54  .      zCol = pT
24a70 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
24a80 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
24a90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29  e;.      if( j )
24aa0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
24ab0 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
24ac0 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
24ad0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
24ae0 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62  ll(&errMsg, pTab
24af0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
24b00 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
24b10 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c  nd(&errMsg, ".",
24b20 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
24b30 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
24b40 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b  (&errMsg, zCol);
24b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72  .    }.  }.  zEr
24b60 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  r = sqlite3StrAc
24b70 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73  cumFinish(&errMs
24b80 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c  g);.  sqlite3Hal
24b90 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
24ba0 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61  se, .    IsPrima
24bb0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
24bc0 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   ? SQLITE_CONSTR
24bd0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20  AINT_PRIMARYKEY 
24be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53               : S
24c00 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
24c10 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
24c20 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
24c30 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
24c40 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
24c50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
24c60 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
24c70 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
24c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24c90 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
24ca0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24cb0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
24cc0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
24cd0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
24ce0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
24cf0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
24d00 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
24d10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
24d20 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
24d30 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
24d40 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
24d50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
24d60 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
24d70 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
24d80 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
24d90 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
24da0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
24db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24dc0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
24dd0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
24de0 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
24df0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
24e00 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
24e10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
24e20 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
24e30 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
24e40 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
24e50 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
24e60 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
24e70 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
24e80 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
24e90 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
24ea0 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
24eb0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
24ee0 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
24ef0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
24f00 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
24f10 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
24f20 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
24f30 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
24f40 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
24f50 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
24f60 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
24f70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
24f80 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
24f90 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
24fa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
24fb0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
24fc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
24fd0 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
24fe0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
24ff0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
25000 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
25010 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
25020 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
25030 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
25040 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
25050 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
25060 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
25070 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
25080 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
25090 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
250a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
250b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
250c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
250d0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
250e0 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
250f0 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
25100 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
25110 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
25120 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
25130 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
25140 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
25150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
25160 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
25170 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
25180 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
25190 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
251a0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
251b0 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
251c0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 49 6e  (pTab) ){.    In
251d0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
251e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
251f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
25200 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
25210 20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54     for(pIndex=pT
25220 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
25230 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
25240 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
25250 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
25260 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
25270 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
25280 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
25290 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
252a0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
252b0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
252c0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ma);.        sql
252d0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
252e0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
252f0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  0, iDb);.       
25300 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
25310 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
25320 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  ex, -1);.      }
25330 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
25340 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
25350 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
25360 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
25370 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
25380 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
25390 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
253a0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
253b0 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
253c0 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
253d0 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
253e0 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
253f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25400 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
25410 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
25420 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
25430 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
25440 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
25450 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
25460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
25470 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
25480 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
254b0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
254c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
254d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
254e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
254f0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
25500 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
25510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
25520 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
25530 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
25540 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25560 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
25570 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
25580 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
25590 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
255a0 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65  es(db) );  /* Ne
255b0 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  eded for schema 
255c0 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28  access */.  for(
255d0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
255e0 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
255f0 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
25600 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
25610 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
25620 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
25630 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
25640 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
25650 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
25660 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
25670 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
25680 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
25690 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
256a0 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
256b0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
256c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
256d0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
256e0 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
256f0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
25700 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
25730 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
25740 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
25750 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
25760 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
25770 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
25780 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
25790 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
257a0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
257b0 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
257c0 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
257d0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
257e0 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
257f0 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
25800 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
25810 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
25820 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
25830 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
25840 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
25850 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
25860 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
25870 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
25880 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
25890 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
258a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
258b0 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
258c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
258d0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
258e0 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
258f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
25900 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
25910 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
25920 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
25930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25940 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
25950 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
25960 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
25970 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
25980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25990 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
259a0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
259b0 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
259c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
259d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
259e0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
259f0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25a00 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
25a10 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
25a20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a40 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
25a50 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
25a60 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a80 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
25a90 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
25aa0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25ab0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
25ac0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
25ad0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
25ae0 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
25af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
25b00 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
25b10 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
25b20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
25b30 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
25b40 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
25b50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
25b60 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
25b70 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
25b80 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
25b90 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
25ba0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
25bb0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
25bc0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
25bd0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25be0 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
25bf0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
25c00 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
25c10 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
25c20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
25c30 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
25c40 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
25c50 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
25c60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
25c70 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
25c80 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
25c90 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
25ca0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
25cb0 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
25cc0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
25cd0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
25ce0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
25cf0 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
25d00 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
25d10 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
25d20 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
25d30 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
25d40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25d50 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
25d60 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
25d70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25d80 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
25d90 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
25da0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
25db0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
25dc0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
25dd0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
25de0 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
25df0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
25e00 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
25e10 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
25e20 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
25e30 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
25e40 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
25e50 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
25e60 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
25e70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
25e80 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
25e90 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
25ea0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25eb0 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
25ec0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
25ed0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
25ee0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
25ef0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25f00 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   z);.  if( pInde
25f10 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
25f20 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
25f30 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
25f40 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
25f50 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
25f60 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
25f70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
25f80 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
25f90 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
25fa0 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
25fb0 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
25fc0 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
25fd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
25fe0 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  urn a KeyInfo st
25ff0 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
26000 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
26010 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e  the given Index.
26020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
26030 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  r should invoke 
26040 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
26050 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74  ref() on the ret
26060 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20  urned object.** 
26070 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69  when it has fini
26080 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a  shed using it..*
26090 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
260a0 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
260b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
260c0 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
260d0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
260e0 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
260f0 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  n;.  int nKey = 
26100 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
26110 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a   KeyInfo *pKey;.
26120 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
26130 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
26140 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e   if( pIdx->uniqN
26150 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b  otNull ){.    pK
26160 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
26170 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
26180 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d  >db, nKey, nCol-
26190 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
261a0 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
261b0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
261c0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c  Parse->db, nCol,
261d0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   0);.  }.  if( p
261e0 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
261f0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
26200 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
26210 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  y) );.    for(i=
26220 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
26230 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
26240 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
26250 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
26260 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
26270 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65   = zColl==sqlite
26280 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a  3StrBINARY ? 0 :
26290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
262a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
262b0 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
262c0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
262d0 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
262e0 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e  rder[i] = pIdx->
262f0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
26300 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
26310 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
26320 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
26330 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  e->rc==SQLITE_ER
26340 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c  ROR_MISSING_COLL
26350 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28  SEQ );.      if(
26360 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d   pIdx->bNoQuery=
26370 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
26380 20 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20   Deactivate the 
26390 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74  index because it
263a0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b   contains an unk
263b0 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20  nown collating. 
263c0 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e         ** sequen
263d0 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61  ce.  The only wa
263e0 79 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68  y to reactive th
263f0 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65  e index is to re
26400 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20  load the.       
26410 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64   ** schema.  Add
26420 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20  ing the missing 
26430 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
26440 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f  ce later does no
26450 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  t.        ** rea
26460 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e  ctive the index.
26470 20 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f    The applicatio
26480 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65  n had the chance
26490 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20   to register.   
264a0 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73       ** the miss
264b0 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20  ing index using 
264c0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65  the collation-ne
264d0 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20  eded callback.  
264e0 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  For.        ** s
264f0 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74  implicity, SQLit
26500 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20  e will not give 
26510 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
26520 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e  a second chance.
26530 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26540 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65      pIdx->bNoQue
26550 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ry = 1;.        
26560 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
26570 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b  ITE_ERROR_RETRY;
26580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
26590 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
265a0 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ef(pKey);.      
265b0 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pKey = 0;.    }.
265c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65    }.  return pKe
265d0 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  y;.}..#ifndef SQ
265e0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
265f0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
26600 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  e is invoked onc
26610 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65  e per CTE by the
26620 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61   parser while pa
26630 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48  rsing a .** WITH
26640 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74   clause. .*/.Wit
26650 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64  h *sqlite3WithAd
26660 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
26670 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
26680 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
26690 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
266a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
266b0 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c  Existing WITH cl
266c0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
266d0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
266e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
266f0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  me of the common
26700 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  -table */.  Expr
26710 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20  List *pArglist, 
26720 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20      /* Optional 
26730 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74  column name list
26740 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
26750 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65  /.  Select *pQue
26760 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ry          /* Q
26770 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69  uery used to ini
26780 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
26790 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
267a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
267b0 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77  db;.  With *pNew
267c0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
267d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
267e0 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69  t the CTE name i
267f0 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20  s unique within 
26800 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65  this WITH clause
26810 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73  . If.  ** not, s
26820 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  tore an error in
26830 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
26840 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65  ture. */.  zName
26850 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
26860 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
26870 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
26880 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68  ( zName && pWith
26890 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
268a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
268b0 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
268c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
268d0 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
268e0 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61   pWith->a[i].zNa
268f0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
26900 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26910 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
26920 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20  cate WITH table 
26930 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  name: %s", zName
26940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26950 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74  .  }..  if( pWit
26960 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
26970 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
26980 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20  izeof(*pWith) + 
26990 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61  (sizeof(pWith->a
269a0 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43  [1]) * pWith->nC
269b0 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  te);.    pNew = 
269c0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
269d0 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74  (db, pWith, nByt
269e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
269f0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
26a00 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
26a10 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b  sizeof(*pWith));
26a20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
26a30 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65  pNew!=0 && zName
26a40 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  !=0) || db->mall
26a50 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69  ocFailed );..  i
26a60 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26a70 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
26a80 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
26a90 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a  (db, pArglist);.
26aa0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26ab0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65  tDelete(db, pQue
26ac0 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
26ad0 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
26ae0 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57  );.    pNew = pW
26af0 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ith;.  }else{.  
26b00 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
26b10 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20  nCte].pSelect = 
26b20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77  pQuery;.    pNew
26b30 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
26b40 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74  pCols = pArglist
26b50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
26b60 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20  ew->nCte].zName 
26b70 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65  = zName;.    pNe
26b80 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
26b90 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  .zCteErr = 0;.  
26ba0 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a    pNew->nCte++;.
26bb0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e    }..  return pN
26bc0 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
26bd0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
26be0 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  f the With objec
26bf0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
26c00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
26c10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26c20 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74  WithDelete(sqlit
26c30 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57  e3 *db, With *pW
26c40 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
26c50 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
26c60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
26c70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
26c80 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43  {.      struct C
26c90 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
26ca0 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
26cb0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
26cc0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
26cd0 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
26ce0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
26cf0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
26d00 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
26d10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74  e3DbFree(db, pCt
26d20 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
26d30 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26d40 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20  ee(db, pWith);. 
26d50 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
26d60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26d70 4d 49 54 5f 43 54 45 29 20 2a 2f 0a              MIT_CTE) */.