/ Hex Artifact Content
Login

Artifact 364c8fa52cca6002be42c987e7421bd38c40e0f3afdf3198bc174fb92da4f4e8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
2120: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
2130: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
2140: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
2150: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
2160: 79 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  y(saveBuf, PARSE
2170: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50  _TAIL(pParse), P
2180: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2190: 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41   memset(PARSE_TA
21a0: 49 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50  IL(pParse), 0, P
21b0: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
21c0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
21d0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
21e0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
21f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2200: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2220: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52  l);.  memcpy(PAR
2230: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
2240: 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f   saveBuf, PARSE_
2250: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72  TAIL_SZ);.  pPar
2260: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
2270: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2280: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2290: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22a0: 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74  E if zTable is t
22b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
22c0: 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74  ystem table that
22d0: 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c   stores the.** l
22e0: 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64  ist of users and
22f0: 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72   their access cr
2300: 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e  edentials..*/.in
2310: 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  t sqlite3UserAut
2320: 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  hTable(const cha
2330: 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65  r *zTable){.  re
2340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72  turn sqlite3_str
2350: 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  icmp(zTable, "sq
2360: 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a  lite_user")==0;.
2370: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2380: 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
2390: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
23a0: 6f 70 65 6e 65 64 20 77 69 74 68 20 74 68 65 20  opened with the 
23b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
23c0: 45 44 5f 53 43 48 45 4d 41 0a 2a 2a 20 66 6c 61  ED_SCHEMA.** fla
23d0: 67 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  g specified, the
23e0: 6e 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  n ensure that th
23f0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2400: 61 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  a for database i
2410: 44 62 0a 2a 2a 20 69 73 20 6c 6f 61 64 65 64 2e  Db.** is loaded.
2420: 20 45 69 74 68 65 72 20 62 79 20 6f 62 74 61 69   Either by obtai
2430: 6e 69 6e 67 20 61 20 53 63 68 65 6d 61 20 6f 62  ning a Schema ob
2440: 6a 65 63 74 20 66 72 6f 6d 20 74 68 65 20 73 63  ject from the sc
2450: 68 65 6d 61 2d 70 6f 6f 6c 2c 20 6f 72 0a 2a 2a  hema-pool, or.**
2460: 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20   by reading the 
2470: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2480: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2490: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
24a0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
24b0: 65 20 77 61 73 20 6e 6f 74 20 6f 70 65 6e 65 64  e was not opened
24c0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
24d0: 4e 5f 53 48 41 52 45 44 5f 53 43 48 45 4d 41 2c  N_SHARED_SCHEMA,
24e0: 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20 73 63   or.** if the sc
24f0: 68 65 6d 61 20 66 6f 72 20 64 61 74 61 62 61 73  hema for databas
2500: 65 20 69 44 62 20 69 73 20 61 6c 72 65 61 64 79  e iDb is already
2510: 20 6c 6f 61 64 65 64 2c 20 74 68 69 73 20 66 75   loaded, this fu
2520: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2530: 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72  p..**.** Non-zer
2540: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
2550: 20 61 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61   a schema is loa
2560: 64 65 64 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  ded, or zero if 
2570: 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 0a  it was already .
2580: 2a 2a 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  ** loaded when t
2590: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
25a0: 20 63 61 6c 6c 65 64 2e 2e 0a 2a 2f 0a 69 6e 74   called...*/.int
25b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4c 6f   sqlite3SchemaLo
25c0: 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ad(sqlite3 *db, 
25d0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 66 28 20  int iDb){.  if( 
25e0: 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64 62  IsReuseSchema(db
25f0: 29 20 0a 20 20 20 26 26 20 44 62 48 61 73 50 72  ) .   && DbHasPr
2600: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
2610: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
2620: 3d 3d 30 20 0a 20 20 20 26 26 20 28 64 62 2d 3e  ==0 .   && (db->
2630: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 7c 7c 20  init.busy==0 || 
2640: 28 69 44 62 21 3d 31 20 26 26 20 64 62 2d 3e 69  (iDb!=1 && db->i
2650: 6e 69 74 2e 69 44 62 3d 3d 31 29 29 0a 20 20 29  nit.iDb==1)).  )
2660: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 75 6d  {.    char *zDum
2670: 6d 79 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  my = 0;.    stru
2680: 63 74 20 73 71 6c 69 74 65 33 49 6e 69 74 49 6e  ct sqlite3InitIn
2690: 66 6f 20 73 76 20 3d 20 64 62 2d 3e 69 6e 69 74  fo sv = db->init
26a0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 62  ;.    memset(&db
26b0: 2d 3e 69 6e 69 74 2c 20 30 2c 20 73 69 7a 65 6f  ->init, 0, sizeo
26c0: 66 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  f(struct sqlite3
26d0: 49 6e 69 74 49 6e 66 6f 29 29 3b 0a 20 20 20 20  InitInfo));.    
26e0: 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28 64  sqlite3InitOne(d
26f0: 62 2c 20 69 44 62 2c 20 26 7a 44 75 6d 6d 79 2c  b, iDb, &zDummy,
2700: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2710: 5f 66 72 65 65 28 7a 44 75 6d 6d 79 29 3b 0a 20  _free(zDummy);. 
2720: 20 20 20 64 62 2d 3e 69 6e 69 74 20 3d 20 73 76     db->init = sv
2730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 44  ;.    return (iD
2740: 62 21 3d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  b!=1);.  }.  ret
2750: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2760: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2770: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2780: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
2790: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
27a0: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
27b0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
27c0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
27d0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
27e0: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
27f0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2800: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2810: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2820: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2830: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2840: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2850: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2860: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2870: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
2880: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
2890: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
28a0: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
28b0: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
28c0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
28d0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
28e0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
28f0: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2900: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
2910: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
2920: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2930: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
2940: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
2950: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
2960: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2970: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
2980: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2990: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
29a0: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
29b0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
29c0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
29d0: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
29e0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
29f0: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2a00: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2a10: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2a20: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2a30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2a40: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2a50: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   );.#if SQLITE_U
2a60: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2a70: 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  ON.  /* Only the
2a80: 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61   admin user is a
2a90: 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74  llowed to know t
2aa0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75  hat the sqlite_u
2ab0: 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65  ser table.  ** e
2ac0: 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64  xists */.  if( d
2ad0: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
2ae0: 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26  l<UAUTH_Admin &&
2af0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
2b00: 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20  Table(zName)!=0 
2b10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2b20: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
2b30: 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28  ile(1){.    for(
2b40: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2b50: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2b60: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69        int j = (i
2b70: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
2b80: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
2b90: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
2ba0: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61       if( zDataba
2bb0: 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2bc0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
2bd0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  e, db->aDb[j].zD
2be0: 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  bSName)==0 ){.  
2bf0: 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f 61        int bUnloa
2c00: 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  d;.        asser
2c10: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2c20: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2c30: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62   0) );.        b
2c40: 55 6e 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  Unload = sqlite3
2c50: 53 63 68 65 6d 61 4c 6f 61 64 28 64 62 2c 20 6a  SchemaLoad(db, j
2c60: 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73  );.        p = s
2c70: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2c80: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2c90: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2ca0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
2cb0: 20 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20   p ) return p;. 
2cc0: 20 20 20 20 20 20 20 69 66 28 20 62 55 6e 6c 6f         if( bUnlo
2cd0: 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
2ce0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 52 65 6c  sqlite3SchemaRel
2cf0: 65 61 73 65 28 64 62 2c 20 6a 29 3b 0a 20 20 20  ease(db, j);.   
2d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d10: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2d20: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2d30: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2d40: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2d50: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2d60: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2d70: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2d80: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2d90: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2da0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2db0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
2dc0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
2dd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
2de0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2df0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
2e00: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2e10: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2e20: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2e30: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2e40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2e50: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2e60: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2e70: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2e80: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2e90: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2ea0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2eb0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ec0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ed0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ee0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ef0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2f00: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2f10: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2f20: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2f30: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2f40: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2f50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2f60: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2f70: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2f80: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2f90: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2fa0: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2fb0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2fc0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2fd0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2fe0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2ff0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
3000: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
3010: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
3020: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3030: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
3040: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
3050: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
3060: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
3070: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
3080: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
3090: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
30a0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
30b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
30c0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
30d0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
30e0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
30f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3100: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
3110: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
3120: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
3130: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3140: 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65  se->db;..  /* Re
3150: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
3160: 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
3170: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
3180: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
3190: 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
31a0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
31b0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
31c0: 20 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61   if( (db->mDbFla
31d0: 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65  gs & DBFLAG_Sche
31e0: 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20  maKnownOk)==0 . 
31f0: 20 20 26 26 20 21 49 73 52 65 75 73 65 53 63 68    && !IsReuseSch
3200: 65 6d 61 28 64 62 29 0a 20 20 20 26 26 20 53 51  ema(db).   && SQ
3210: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
3220: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
3230: 65 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  e).  ){.    retu
3240: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  rn 0;.  }..  p =
3250: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
3260: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
3270: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
3280: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
3290: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
32a0: 41 42 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a  ABLE.    /* If z
32b0: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20  Name is the not 
32c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61  the name of a ta
32d0: 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d  ble in the schem
32e0: 61 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a  a created using.
32f0: 20 20 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74      ** CREATE, t
3300: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
3310: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 6e 61   if it is the na
3320: 6d 65 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c  me of an virtual
3330: 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
3340: 2a 2a 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f  ** can be an epo
3350: 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
3360: 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  able. */.    if(
3370: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
3380: 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Vtab==0 ){.     
3390: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
33a0: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  (Module*)sqlite3
33b0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d  HashFind(&db->aM
33c0: 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  odule, zName);. 
33d0: 20 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30       if( pMod==0
33e0: 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
33f0: 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61  icmp(zName, "pra
3400: 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  gma_", 7)==0 ){.
3410: 20 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73          pMod = s
3420: 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62  qlite3PragmaVtab
3430: 52 65 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61  Register(db, zNa
3440: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
3450: 20 20 20 69 66 28 20 70 4d 6f 64 20 29 7b 0a 20     if( pMod ){. 
3460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63         sqlite3Sc
3470: 68 65 6d 61 4c 6f 61 64 28 64 62 2c 20 30 29 3b  hemaLoad(db, 0);
3480: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
3490: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
34a0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
34b0: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
34c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f        return pMo
34d0: 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20  d->pEpoTab;.    
34e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
3500: 66 28 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54  f( flags & LOCAT
3510: 45 5f 4e 4f 45 52 52 20 29 20 72 65 74 75 72 6e  E_NOERR ) return
3520: 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
3530: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
3540: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56  .  }else if( IsV
3550: 69 72 74 75 61 6c 28 70 29 20 26 26 20 70 50 61  irtual(p) && pPa
3560: 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62  rse->disableVtab
3570: 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20   ){.    p = 0;. 
3580: 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   }..  if( p==0 )
3590: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
35a0: 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26   *zMsg = flags &
35b0: 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22   LOCATE_VIEW ? "
35c0: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
35d0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
35e0: 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20  .    if( zDbase 
35f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3600: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3610: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3620: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3630: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
3640: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3650: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
3660: 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61  : %s", zMsg, zNa
3670: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
3680: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3690: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
36a0: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
36b0: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
36c0: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
36d0: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
36e0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
36f0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
3700: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
3710: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
3720: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
3730: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3740: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3750: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3760: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3770: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3780: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3790: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
37a0: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
37b0: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
37c0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
37d0: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
37e0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
37f0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
3800: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
3810: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
3820: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
3830: 61 72 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61  arse, .  u32 fla
3840: 67 73 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  gs,.  struct Src
3850: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a  List_item *p.){.
3860: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
3870: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
3880: 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d  pSchema==0 || p-
3890: 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b  >zDatabase==0 );
38a0: 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d  .  if( p->pSchem
38b0: 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  a ){.    int iDb
38c0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
38d0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
38e0: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
38f0: 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73  .    zDb = pPars
3900: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
3910: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  zDbSName;.  }els
3920: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
3930: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3940: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3950: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3960: 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61  e, flags, p->zNa
3970: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3980: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3990: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
39a0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
39b0: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
39c0: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
39d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
39e0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
39f0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
3a00: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
3a10: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
3a20: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3a30: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3a40: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3a50: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3a60: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3a70: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3a80: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3a90: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3aa0: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3ab0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3ac0: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3ad0: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
3ae0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
3af0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
3b00: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
3b10: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
3b20: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
3b30: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3b40: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3b50: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3b60: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3b70: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3b80: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3b90: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3ba0: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3bb0: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3bc0: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3bd0: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
3be0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
3bf0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
3c00: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
3c10: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
3c20: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
3c30: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3c40: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3c50: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3c60: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3c70: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3c80: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3c90: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3ca0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3cb0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3cc0: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3cd0: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
3ce0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
3cf0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
3d00: 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[j].zDbSNam
3d10: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
3d20: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3d30: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3d40: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
3d50: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
3d60: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
3d70: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >idxHash, zName)
3d80: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
3d90: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
3da0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
3db0: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
3dc0: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
3dd0: 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  x.*/.void sqlite
3de0: 33 46 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74  3FreeIndex(sqlit
3df0: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
3e00: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3e10: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20  E_OMIT_ANALYZE. 
3e20: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
3e30: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
3e40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
3e50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3e60: 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65  , p->pPartIdxWhe
3e70: 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
3e80: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
3e90: 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20   p->aColExpr);. 
3ea0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3eb0: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
3ec0: 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a    if( p->isResiz
3ed0: 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ed ) sqlite3DbFr
3ee0: 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70  ee(db, (void *)p
3ef0: 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65  ->azColl);.#ifde
3f00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3f10: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
3f20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
3f30: 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64  >aiRowEst);.#end
3f40: 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
3f50: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
3f60: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
3f70: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
3f80: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
3f90: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3fa0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
3fb0: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
3fc0: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
3fd0: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
3fe0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
3ff0: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
4000: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
4010: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
4020: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
4030: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
4040: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
4050: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
4060: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
4070: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
4080: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
4090: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61  ex *pIndex;.  Ha
40a0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
40b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
40c0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
40d0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
40e0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
40f0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
4100: 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Hash;.  pIndex =
4110: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4120: 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61  rt(pHash, zIdxNa
4130: 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  me, 0);.  if( AL
4140: 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a  WAYS(pIndex) ){.
4150: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
4160: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
4170: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
4180: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
4190: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
41a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
41b0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
41c0: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  p;.      /* Just
41d0: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
41e0: 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65  AYS();  The inde
41f0: 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65  x must be on the
4200: 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a   list of.      *
4210: 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20  * indices. */.  
4220: 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e      p = pIndex->
4230: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a  pTable->pIndex;.
4240: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
4250: 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65  AYS(p) && p->pNe
4260: 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20  xt!=pIndex ){ p 
4270: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
4280: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
4290: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
42a0: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
42b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
42c0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
42d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
42e0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62  ite3FreeIndex(db
42f0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
4300: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
4310: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
4320: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ange;.}../*.** L
4330: 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20  ook through the 
4340: 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74  list of open dat
4350: 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64  abase files in d
4360: 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a  b->aDb[] and if.
4370: 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e  ** any have been
4380: 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20   closed, remove 
4390: 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69  them from the li
43a0: 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20  st.  Reallocate 
43b0: 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d  the.** db->aDb[]
43c0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 20   structure to a 
43d0: 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66  smaller size, if
43e0: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
43f0: 20 45 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d   Entry 0 (the "m
4400: 61 69 6e 22 20 64 61 74 61 62 61 73 65 29 20 61  ain" database) a
4410: 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68 65 20  nd entry 1 (the 
4420: 22 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 29  "temp" database)
4430: 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61  .** are never ca
4440: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62 65 69  ndidates for bei
4450: 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f  ng collapsed..*/
4460: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
4470: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
4480: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ay(sqlite3 *db){
4490: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
44a0: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
44b0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
44c0: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
44d0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
44e0: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
44f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4500: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d  3DbFree(db, pDb-
4510: 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20  >zDbSName);.    
4520: 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20    pDb->zDbSName 
4530: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
4540: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
4550: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
4560: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
4570: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
4580: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62     j++;.  }.  db
4590: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
45a0: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
45b0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
45c0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
45d0: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
45e0: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
45f0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
4600: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
4610: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
4620: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
4630: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
4640: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
4650: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  et the schema fo
4660: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
4670: 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c  t index iDb.  Al
4680: 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  so reset the.** 
4690: 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68  TEMP schema.  Th
46a0: 65 20 72 65 73 65 74 20 69 73 20 64 65 66 65 72  e reset is defer
46b0: 72 65 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65  red if db->nSche
46c0: 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65  maLock is not ze
46d0: 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20  ro..** Deferred 
46e0: 72 65 73 65 74 73 20 6d 61 79 20 62 65 20 72 75  resets may be ru
46f0: 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74  n by calling wit
4700: 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64  h iDb<0..*/.void
4710: 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
4720: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
4730: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
4740: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
4750: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
4760: 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
4770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
4780: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4790: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
47a0: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
47b0: 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
47c0: 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20  _ResetWanted);. 
47d0: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
47e0: 28 64 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74  (db, 1, DB_Reset
47f0: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d  Wanted);.    db-
4800: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42  >mDbFlags &= ~DB
4810: 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e  FLAG_SchemaKnown
4820: 4f 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  Ok;.  }.  if( db
4830: 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30  ->nSchemaLock==0
4840: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4850: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
4860: 7b 0a 20 20 20 20 20 20 69 66 28 20 44 62 48 61  {.      if( DbHa
4870: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  sProperty(db, i,
4880: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
4890: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
48a0: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 4f 72  te3SchemaClearOr
48b0: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 69  Disconnect(db, i
48c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
48d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
48e0: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
48f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
4900: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
4910: 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e  abases (includin
4920: 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20  g.** "main" and 
4930: 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69  "temp") for a si
4940: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f  ngle database co
4950: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
4960: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c  d sqlite3ResetAl
4970: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
4980: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
4990: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
49a0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
49b0: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
49c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d  0; i<db->nDb; i=
49d0: 28 69 3f 69 2b 31 3a 32 29 29 7b 0a 20 20 20 20  (i?i+1:2)){.    
49e0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
49f0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
4a00: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
4a10: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 53 63       if( db->nSc
4a20: 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  hemaLock==0 ){. 
4a30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63         sqlite3Sc
4a40: 68 65 6d 61 43 6c 65 61 72 4f 72 44 69 73 63 6f  hemaClearOrDisco
4a50: 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b 0a 20 20  nnect(db, i);.  
4a60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4a70: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
4a80: 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74  (db, i, DB_Reset
4a90: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  Wanted);.      }
4aa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4ab0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
4ac0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
4ad0: 6d 61 29 3b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c  ma);.  db->mDbFl
4ae0: 61 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f  ags &= ~(DBFLAG_
4af0: 53 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46  SchemaChange|DBF
4b00: 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f  LAG_SchemaKnownO
4b10: 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61  k);.  sqlite3Vta
4b20: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
4b30: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
4b40: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69  eaveAll(db);.  i
4b50: 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  f( db->nSchemaLo
4b60: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ck==0 ){.    sql
4b70: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4b80: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20  baseArray(db);. 
4b90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
4ba0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4bb0: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4bc0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4bd0: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4be0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4bf0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4c00: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44  ->mDbFlags &= ~D
4c10: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
4c20: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ge;.}../*.** Del
4c30: 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ete memory alloc
4c40: 61 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  ated for the col
4c50: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74  umn names of a t
4c60: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68  able or view (th
4c70: 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b  e.** Table.aCol[
4c80: 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69  ] array)..*/.voi
4c90: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43  d sqlite3DeleteC
4ca0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74  olumnNames(sqlit
4cb0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
4cc0: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
4cd0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4ce0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
4cf0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
4d00: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
4d10: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
4d20: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
4d30: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
4d40: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
4d50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4d60: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
4d70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4d80: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
4d90: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
4da0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4db0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
4dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4dd0: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
4de0: 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Col);.  }.}../*.
4df0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
4e00: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
4e10: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
4e20: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
4e30: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
4e40: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
4e50: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
4e60: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
4e70: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
4e80: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
4e90: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
4ea0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
4eb0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
4ec0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
4ed0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
4ee0: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
4ef0: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
4f00: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
4f10: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
4f20: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
4f30: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
4f40: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
4f50: 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  he db parameter 
4f60: 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74  is optional.  It
4f70: 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68   is needed if th
4f80: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a  e Table object .
4f90: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b  ** contains look
4fa0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28  aside memory.  (
4fb0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e  Table objects in
4fc0: 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e   the schema do n
4fd0: 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73  ot use.** lookas
4fe0: 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20  ide memory, but 
4ff0: 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54  some ephemeral T
5000: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e  able objects do.
5010: 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20  )  Or the.** db 
5020: 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65  parameter can be
5030: 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70   used with db->p
5040: 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d  nBytesFreed to m
5050: 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72  easure the memor
5060: 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  y.** used by the
5070: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a   Table object..*
5080: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
5090: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65  LITE_NOINLINE de
50a0: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
50b0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
50c0: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
50d0: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
50e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
50f0: 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64  EBUG.  /* Record
5100: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
5110: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
5120: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
5130: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
5140: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
5150: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
5160: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
5170: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
5180: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
5190: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
51a0: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
51b0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
51c0: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20   int nLookaside 
51d0: 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26  = 0;.  if( db &&
51e0: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
51f0: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
5200: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f  l)==0 ){.    nLo
5210: 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65  okaside = sqlite
5220: 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64  3LookasideUsed(d
5230: 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  b, 0);.  }.#endi
5240: 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  f..  /* Delete a
5250: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
5260: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
5270: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
5280: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
5290: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
52a0: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
52b0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
52c0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
52d0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70  ssert( pIndex->p
52e0: 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e  Schema==pTable->
52f0: 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20  pSchema.        
5300: 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70   || (IsVirtual(p
5310: 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78  Table) && pIndex
5320: 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
5330: 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
5340: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62  ) );.    if( (db
5350: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  ==0 || db->pnByt
5360: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21  esFreed==0) && !
5370: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
5380: 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
5390: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
53a0: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
53b0: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
53c0: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
53d0: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20  3HashInsert(.   
53e0: 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70        &pIndex->p
53f0: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
5400: 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20   zName, 0.      
5410: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5420: 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65   db==0 || sqlite
5430: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5440: 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
5450: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
5460: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
5470: 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d  pIndex || pOld==
5480: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
5490: 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28  qlite3FreeIndex(
54a0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
54b0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
54c0: 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  y foreign keys a
54d0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
54e0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
54f0: 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20  te3FkDelete(db, 
5500: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44  pTable);..  /* D
5510: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
5520: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
5530: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
5540: 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
5550: 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
5560: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5570: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  b, pTable->zName
5580: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
5590: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
55a0: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
55b0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
55c0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
55d0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
55e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
55f0: 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29   pTable->pCheck)
5600: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5610: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
5620: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
5630: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
5640: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
5650: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
5660: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  able);..  /* Ver
5670: 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b  ify that no look
5680: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73  aside memory was
5690: 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20   used by schema 
56a0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65  tables */.  asse
56b0: 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d  rt( nLookaside==
56c0: 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  0 || nLookaside=
56d0: 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64  =sqlite3Lookasid
56e0: 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d  eUsed(db,0) );.}
56f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
5700: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5710: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
5720: 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ble){.  /* Do no
5730: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
5740: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
5750: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
5760: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
5770: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
5780: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
5790: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
57a0: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
57b0: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29  pTable->nTabRef)
57c0: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >0) ) return;.  
57d0: 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  deleteTable(db, 
57e0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pTable);.}.../*.
57f0: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
5800: 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ven table from t
5810: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  he hash tables a
5820: 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68  nd the delete th
5830: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63  e.** table struc
5840: 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74  ture with all it
5850: 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  s indices and fo
5860: 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76  reign keys..*/.v
5870: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
5880: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
5890: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
58a0: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
58b0: 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54   *zTabName){.  T
58c0: 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70  able *p;.  Db *p
58d0: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
58e0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
58f0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
5900: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
5910: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b  ert( zTabName );
5920: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5930: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
5940: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
5950: 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61  .  testcase( zTa
5960: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20  bName[0]==0 );  
5970: 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74  /* Zero-length t
5980: 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61  able names are a
5990: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20  llowed */.  pDb 
59a0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
59b0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
59c0: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
59d0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
59e0: 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20   zTabName, 0);. 
59f0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5a00: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62  ble(db, p);.  db
5a10: 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
5a20: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
5a30: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  e;.}../*.** Give
5a40: 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  n a token, retur
5a50: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
5a60: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
5a70: 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20  text of that.** 
5a80: 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f  token.  Space to
5a90: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
5aa0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
5ab0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5ac0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
5ad0: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
5ae0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
5af0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
5b00: 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d   Any quotation m
5b10: 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65  arks (ex:  "name
5b20: 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65  ", 'name', [name
5b30: 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68  ], or `name`) th
5b40: 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74  at.** surround t
5b50: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74  he body of the t
5b60: 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64  oken are removed
5b70: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61  ..**.** Tokens a
5b80: 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f  re often just po
5b90: 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  inters into the 
5ba0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
5bb0: 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20  t and so.** are 
5bc0: 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  not \000 termina
5bd0: 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ted and are not 
5be0: 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65  persistent.  The
5bf0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
5c00: 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d  .** is \000 term
5c10: 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65  inated and is pe
5c20: 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61  rsistent..*/.cha
5c30: 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72  r *sqlite3NameFr
5c40: 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20  omToken(sqlite3 
5c50: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
5c60: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
5c70: 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  e;.  if( pName )
5c80: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
5c90: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
5ca0: 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d  b, (char*)pName-
5cb0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
5cc0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
5cd0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  e(zName);.  }els
5ce0: 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  e{.    zName = 0
5cf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
5d00: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Name;.}../*.** O
5d10: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  pen the sqlite_m
5d20: 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72  aster table stor
5d30: 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e  ed in database n
5d40: 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a  umber iDb for.**
5d50: 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61   writing. The ta
5d60: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73  ble is opened us
5d70: 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f  ing cursor 0..*/
5d80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65  .void sqlite3Ope
5d90: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72  nMasterTable(Par
5da0: 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b  se *p, int iDb){
5db0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
5dc0: 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a  ite3GetVdbe(p);.
5dd0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
5de0: 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45  ck(p, iDb, MASTE
5df0: 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45  R_ROOT, 1, MASTE
5e00: 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74  R_NAME);.  sqlit
5e10: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5e20: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
5e30: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
5e40: 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20   iDb, 5);.  if( 
5e50: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
5e60: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
5e70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
5e80: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
5e90: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
5ea0: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
5eb0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
5ec0: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
5ed0: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
5ee0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
5ef0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
5f00: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
5f10: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
5f20: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
5f30: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
5f40: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
5f50: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5f60: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
5f70: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
5f80: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
5f90: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
5fa0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5fb0: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
5fc0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5fd0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
5fe0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
5ff0: 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  *pDb;.    for(i=
6000: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
6010: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
6020: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
6030: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
6040: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44  lite3_stricmp(pD
6050: 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61  b->zDbSName, zNa
6060: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
6070: 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20     /* "main" is 
6080: 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74  always an accept
6090: 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74  able alias for t
60a0: 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62  he primary datab
60b0: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ase.      ** eve
60c0: 6e 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  n if it has been
60d0: 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53   renamed using S
60e0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d  QLITE_DBCONFIG_M
60f0: 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20  AINDBNAME. */.  
6100: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20      if( i==0 && 
6110: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
6120: 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65  mp("main", zName
6130: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
6140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
6150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
6160: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
6170: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
6180: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
6190: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
61a0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
61b0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
61c0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
61d0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
61e0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
61f0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
6200: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
6210: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
6220: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
6230: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
6240: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
6250: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
6260: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pName){.  int i;
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6290: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
62a0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  r */.  char *zNa
62b0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
62d0: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
62e0: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e  hing for */.  zN
62f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
6300: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
6310: 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c  Name);.  i = sql
6320: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
6330: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  b, zName);.  sql
6340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
6350: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
6360: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
6370: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
6380: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
6390: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
63a0: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
63b0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
63c0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
63d0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
63e0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
63f0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
6400: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
6410: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
6420: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
6430: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
6440: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
6450: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
6460: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
6470: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
6480: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
6490: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
64a0: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
64b0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
64c0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
64d0: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
64e0: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
64f0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6500: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
6510: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
6520: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
6530: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
6540: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
6550: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
6560: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
6570: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
6580: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
6590: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
65a0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
65b0: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
65c0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
65d0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
65e0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
65f0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
6600: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
6610: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
6620: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
6630: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
6640: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
6650: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
6660: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
6670: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
6680: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
6690: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
66a0: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
66b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
66c0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
66d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
66e0: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
66f0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
6700: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6710: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
6720: 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a  t( pName2!=0 );.
6730: 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e    if( pName2->n>
6740: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
6750: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
6760: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
6780: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
6790: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
67a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55  1;.    }.    *pU
67b0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
67c0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
67d0: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
67e0: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
67f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
6800: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6810: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
6820: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
6830: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
6840: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
6850: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
6860: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
6870: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
6880: 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42   || IN_RENAME_OB
6890: 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20  JECT.           
68a0: 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61    || (db->mDbFla
68b0: 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75  gs & DBFLAG_Vacu
68c0: 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62  um)!=0);.    iDb
68d0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
68e0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
68f0: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
6900: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
6910: 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  ** True if PRAGM
6920: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
6930: 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73  a is ON.*/.int s
6940: 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63  qlite3WritableSc
6950: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
6960: 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ){.  testcase( (
6970: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6980: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6990: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
69a0: 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
69b0: 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53  e( (db->flags&(S
69c0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
69d0: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
69e0: 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20  ve))==.         
69f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69        SQLITE_Wri
6a00: 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65  teSchema );.  te
6a10: 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61  stcase( (db->fla
6a20: 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65  gs&(SQLITE_Write
6a30: 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65  Schema|SQLITE_De
6a40: 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20  fensive))==.    
6a50: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
6a60: 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20  E_Defensive );. 
6a70: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6a80: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6a90: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6aa0: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20  _Defensive))==. 
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6ac0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6ad0: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
6ae0: 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve) );.  return 
6af0: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
6b00: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
6b10: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
6b20: 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53  )==SQLITE_WriteS
6b30: 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
6b40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6b50: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
6b60: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
6b70: 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67  g zName is a leg
6b80: 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65  al.** unqualifie
6b90: 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  d name for a new
6ba0: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   schema object (
6bb0: 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69  table, index, vi
6bc0: 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72  ew or.** trigger
6bd0: 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65  ). All names are
6be0: 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68   legal except th
6bf0: 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77  ose that begin w
6c00: 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a  ith the string.*
6c10: 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20  * "sqlite_" (in 
6c20: 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20  upper, lower or 
6c30: 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69  mixed case). Thi
6c40: 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  s portion of the
6c50: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73   namespace.** is
6c60: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
6c70: 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69  ternal use..*/.i
6c80: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  nt sqlite3CheckO
6c90: 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20  bjectName(Parse 
6ca0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
6cb0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
6cc0: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
6cd0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
6ce0: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a  rse->nested==0 .
6cf0: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
6d00: 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
6d10: 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  ma(pParse->db)==
6d20: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6d30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6d40: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6d50: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
6d60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6d70: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
6d80: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
6d90: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
6da0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
6db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
6dc0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
6dd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6de0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6df0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
6e00: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
6e10: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
6e20: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
6e30: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
6e40: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
6e50: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
6e60: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
6e70: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
6e80: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
6e90: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
6ea0: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
6eb0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
6ec0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
6ed0: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
6ee0: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
6ef0: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
6f00: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
6f10: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
6f20: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
6f30: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
6f40: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
6f50: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
6f60: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
6f70: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
6f80: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
6f90: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
6fa0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
6fb0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
6fc0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
6fd0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
6fe0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
6ff0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
7000: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
7010: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
7020: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
7030: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7040: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
7050: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
7060: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7070: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
7080: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
7090: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
70a0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
70b0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
70c0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
70d0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
70e0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
70f0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
7100: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
7110: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
7120: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
7130: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
7140: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
7150: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
7160: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
7170: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
7180: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
7190: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
71a0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
71b0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
71c0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
71d0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
71e0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
71f0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
7200: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
7210: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
7220: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
7230: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
7240: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
7250: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
7260: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
7270: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
7280: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
7290: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
72a0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
72b0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
72c0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
72d0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
72e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
72f0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
7300: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
7310: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
7320: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
7330: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
7340: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
7350: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
7360: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
7370: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
7380: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
7390: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
73a0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
73b0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
73c0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
73d0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
73e0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
73f0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
7400: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
7410: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7420: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
7430: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
7440: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
7450: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
7460: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
7470: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
7480: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
7490: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
74a0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
74b0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
74c0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
74d0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
74e0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
74f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7500: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
7510: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
7520: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
7530: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
7540: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
7550: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
7560: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
7570: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
7580: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
7590: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
75a0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
75b0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
75c0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
75d0: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
75e0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
75f0: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
7600: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
7610: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
7620: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
7630: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7640: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
7650: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
7660: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
7670: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
7680: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
7690: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
76a0: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
76b0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
76c0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
76d0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
76e0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
76f0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
7700: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
7710: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
7720: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
7730: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
7740: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
7750: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
7760: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
7770: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
7780: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
7790: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
77a0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
77b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
77c0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
77d0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
77e0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
77f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7800: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
7810: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
7820: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
7830: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7840: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7850: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
7860: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
7870: 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT ){.      sqli
7880: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
7890: 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
78a0: 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a  )zName, pName);.
78b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
78c0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
78d0: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a   *pName;.  if( z
78e0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
78f0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
7900: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
7910: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
7920: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
7930: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7940: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
7950: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
7960: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
7970: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7980: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7990: 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65  N.  assert( isTe
79a0: 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d  mp==0 || isTemp=
79b0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
79c0: 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
79d0: 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20  iew==1 );.  {.  
79e0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
79f0: 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  8 aCode[] = {.  
7a00: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
7a10: 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  TE_TABLE,.      
7a20: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7a30: 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  EMP_TABLE,.     
7a40: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7a50: 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c  VIEW,.       SQL
7a60: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7a70: 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20  VIEW.    };.    
7a80: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7a90: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
7aa0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
7ab0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7ac0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
7ad0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
7ae0: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
7af0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7b00: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7b20: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
7b30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
7b40: 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64  Parse, (int)aCod
7b50: 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65  e[isTemp+2*isVie
7b60: 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  w],.            
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
7b90: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7ba0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7bb0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7bc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
7bd0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
7be0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
7bf0: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
7c00: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
7c10: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
7c20: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
7c30: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
7c40: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
7c50: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
7c60: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
7c70: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
7c80: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7c90: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
7ca0: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
7cb0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
7cc0: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
7cd0: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
7ce0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
7cf0: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
7d00: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
7d10: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
7d20: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
7d30: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
7d40: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
7d50: 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52   !IN_SPECIAL_PAR
7d60: 53 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  SE ){.    char *
7d70: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7d80: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
7d90: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
7da0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
7db0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
7dc0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7dd0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7de0: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71  .    pTable = sq
7df0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
7e00: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
7e10: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
7e20: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
7e30: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
7e40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7e50: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
7e60: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
7e70: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
7e80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7e90: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
7ea0: 62 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f  busy || CORRUPT_
7eb0: 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DB );.        sq
7ec0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
7ed0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
7ee0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
7ef0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7f00: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7f10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
7f20: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
7f30: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
7f40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7f50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
7f60: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
7f70: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
7f80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
7f90: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7fa0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7fb0: 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73   }..  pTable = s
7fc0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7fd0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
7fe0: 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61  ble));.  if( pTa
7ff0: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ble==0 ){.    as
8000: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
8010: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50  Failed );.    pP
8020: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
8030: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
8040: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
8050: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
8060: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
8070: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
8080: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
8090: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
80a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
80b0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
80c0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
80d0: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  ble->nTabRef = 1
80e0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
80f0: 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20  DEFAULT_ROWEST. 
8100: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
8110: 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
8120: 45 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  Est(SQLITE_DEFAU
8130: 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73  LT_ROWEST);.#els
8140: 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  e.  pTable->nRow
8150: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
8160: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
8170: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
8180: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
8190: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
81a0: 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  ewTable==0 );.  
81b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
81c0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
81d0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
81e0: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
81f0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
8200: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
8210: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
8220: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
8230: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
8240: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
8250: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
8260: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
8270: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
8280: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
8290: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
82a0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
82b0: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
82c0: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
82d0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
82e0: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
82f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
8300: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
8310: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
8320: 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   );.    pTable->
8330: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
8340: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23   = pTable;.  }.#
8350: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
8360: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
8370: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8380: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
8390: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
83a0: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
83b0: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
83c0: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
83d0: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
83e0: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
83f0: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
8400: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
8410: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
8420: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
8430: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
8440: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
8450: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
8460: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
8470: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
8480: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
8490: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
84a0: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
84b0: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
84c0: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
84d0: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
84e0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
84f0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
8500: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
8510: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
8520: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
8530: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
8540: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
8550: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  .    int addr1;.
8560: 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d      int fileForm
8570: 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31  at;.    int reg1
8580: 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20  , reg2, reg3;.  
8590: 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69    /* nullRow[] i
85a0: 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65  s an OP_Record e
85b0: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77  ncoding of a row
85c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55   containing 5 NU
85d0: 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  LLs */.    stati
85e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c  c const char nul
85f0: 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c  lRow[] = { 6, 0,
8600: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
8610: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
8620: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8630: 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
8640: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8650: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8660: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
8670: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8680: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
8690: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
86a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
86b0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
86c0: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
86d0: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
86e0: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
86f0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
8700: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
8710: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
8720: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
8730: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8740: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
8750: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
8760: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
8770: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
8780: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
8790: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
87a0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
87b0: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
87c0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
87d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
87e0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
87f0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
8800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
8810: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20  , OP_If, reg3); 
8820: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8830: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
8840: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8850: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
8860: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
8880: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
8890: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
88a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
88b0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
88c0: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
88d0: 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61  ORMAT, fileForma
88e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
88f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8900: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
8910: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
8920: 49 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20  ING, ENC(db));. 
8930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
8940: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
8950: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
8960: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
8970: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
8980: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
8990: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
89a0: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
89b0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
89c0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
89d0: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
89e0: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
89f0: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
8a00: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
8a10: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
8a20: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
8a30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
8a40: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
8a50: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69   entry is left i
8a60: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
8a70: 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20  e->regRowid..   
8a80: 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
8a90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
8aa0: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66  new table is lef
8ab0: 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d  t in reg pParse-
8ac0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
8ad0: 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72   The rowid and r
8ae0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
8af0: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65  values are neede
8b00: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
8b10: 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  at.    ** sqlite
8b20: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67  3EndTable will g
8b30: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
8b40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8b50: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
8b60: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
8b70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8b80: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
8b90: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
8ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8bb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8bc0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
8bd0: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
8be0: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
8bf0: 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72    pParse->addrCr
8c00: 54 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73  Tab =.         s
8c10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8c20: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72  (v, OP_CreateBtr
8c30: 65 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42  ee, iDb, reg2, B
8c40: 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20  TREE_INTKEY);.  
8c50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
8c60: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
8c70: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
8c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c90: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
8ca0: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
8cb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8cc0: 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36  p4(v, OP_Blob, 6
8cd0: 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52  , reg3, 0, nullR
8ce0: 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  ow, P4_STATIC);.
8cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8d00: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
8d10: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
8d20: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8d30: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
8d40: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
8d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8d60: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
8d70: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
8d80: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
8d90: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
8da0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
8db0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
8dc0: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
8dd0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8de0: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
8df0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
8e00: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
8e10: 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20  t properties of 
8e20: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62  a table column b
8e30: 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67  ased on the (mag
8e40: 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66  ical).** name of
8e50: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a   the column..*/.
8e60: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
8e70: 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53  E_HIDDEN_COLUMNS
8e80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
8e90: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
8ea0: 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61  mName(Table *pTa
8eb0: 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29  b, Column *pCol)
8ec0: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  {.  if( sqlite3_
8ed0: 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a  strnicmp(pCol->z
8ee0: 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f  Name, "__hidden_
8ef0: 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20  _", 10)==0 ){.  
8f00: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
8f10: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44   |= COLFLAG_HIDD
8f20: 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
8f30: 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54  pTab && pCol!=pT
8f40: 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f  ab->aCol && (pCo
8f50: 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  l[-1].colFlags &
8f60: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29   COLFLAG_HIDDEN)
8f70: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   ){.    pTab->ta
8f80: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f  bFlags |= TF_OOO
8f90: 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65  Hidden;.  }.}.#e
8fa0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
8fb0: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
8fc0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
8fd0: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
8fe0: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
8ff0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
9000: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
9010: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
9020: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
9030: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
9040: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
9050: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
9060: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
9070: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
9080: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
9090: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
90a0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
90b0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
90c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
90d0: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
90e0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
90f0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
9100: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9110: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
9120: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  ;.  char *zType;
9130: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
9140: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9150: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
9160: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
9170: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
9180: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
9190: 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d  >nCol+1>db->aLim
91a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
91b0: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
91c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
91d0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
91e0: 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c   columns on %s",
91f0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
9200: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20  return;.  }.  z 
9210: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9220: 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  cRaw(db, pName->
9230: 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32  n + pType->n + 2
9240: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
9250: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e  return;.  if( IN
9260: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
9270: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
9280: 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
9290: 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b  void*)z, pName);
92a0: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61  .  memcpy(z, pNa
92b0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
92c0: 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20  ;.  z[pName->n] 
92d0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
92e0: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
92f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
9300: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
9310: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c  lite3_stricmp(z,
9320: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
9330: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
9340: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9350: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
9360: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
9370: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
9380: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9390: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
93a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
93b0: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
93c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
93d0: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
93e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
93f0: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
9400: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
9410: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
9420: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
9430: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
9440: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
9450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
9460: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
9470: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
9480: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
9490: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
94a0: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
94b0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
94c0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
94d0: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  z;.  sqlite3Colu
94e0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
94f0: 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20  Name(p, pCol);. 
9500: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
9510: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
9520: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
9530: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
9540: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
9550: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
9560: 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68    ** 'BLOB' with
9570: 20 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20   a default size 
9580: 6f 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  of 4 bytes. */. 
9590: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
95a0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
95b0: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  LOB;.    pCol->s
95c0: 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66  zEst = 1;.#ifdef
95d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
95e0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
95f0: 0a 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69  .    if( 4>=sqli
9600: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
9610: 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  szSorterRef ){. 
9620: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
9630: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53  ags |= COLFLAG_S
9640: 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a  ORTERREF;.    }.
9650: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
9660: 20 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20      zType = z + 
9670: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9680: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63  z) + 1;.    memc
9690: 70 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d  py(zType, pType-
96a0: 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20  >z, pType->n);. 
96b0: 20 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e     zType[pType->
96c0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  n] = 0;.    sqli
96d0: 74 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65  te3Dequote(zType
96e0: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  );.    pCol->aff
96f0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
9700: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
9710: 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43  e, pCol);.    pC
9720: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
9730: 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b  COLFLAG_HASTYPE;
9740: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  .  }.  p->nCol++
9750: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  ;.  pParse->cons
9760: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30  traintName.n = 0
9770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9780: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9790: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
97a0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
97b0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
97c0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
97d0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
97e0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
97f0: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
9800: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
9810: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
9820: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
9830: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
9840: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
9850: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9860: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
9870: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
9880: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
9890: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
98a0: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
98b0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70  n *pCol;.  p = p
98c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
98d0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
98e0: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
98f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
9900: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9910: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d  nCol-1];.  pCol-
9920: 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  >notNull = (u8)o
9930: 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62  nError;.  p->tab
9940: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e  Flags |= TF_HasN
9950: 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65  otNull;..  /* Se
9960: 74 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c  t the uniqNotNul
9970: 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e  l flag on any UN
9980: 49 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78  IQUE or PK index
9990: 65 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  es already creat
99a0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  ed.  ** on this 
99b0: 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66  column.  */.  if
99c0: 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73  ( pCol->colFlags
99d0: 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55   & COLFLAG_UNIQU
99e0: 45 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  E ){.    Index *
99f0: 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
9a00: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
9a10: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9a20: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
9a30: 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ert( pIdx->nKeyC
9a40: 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f  ol==1 && pIdx->o
9a50: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
9a60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
9a70: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
9a80: 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  p->nCol-1 ){.   
9a90: 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e       pIdx->uniqN
9aa0: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  otNull = 1;.    
9ab0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
9ac0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
9ad0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
9ae0: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
9af0: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
9b00: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
9b10: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
9b20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9b30: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
9b40: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
9b50: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
9b60: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
9b70: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
9b80: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
9b90: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
9ba0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
9bb0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
9bc0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
9bd0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
9be0: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
9bf0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
9c00: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
9c10: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
9c20: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
9c30: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
9c40: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
9c50: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
9c60: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
9c70: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9c80: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
9c90: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
9ca0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
9cb0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cd0: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
9ce0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9cf0: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
9d00: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9d10: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
9d20: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
9d30: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
9d40: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
9d50: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9d60: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
9d70: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42    | SQLITE_AFF_B
9d80: 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  LOB.** 'REAL'   
9d90: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9da0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
9db0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9dc0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
9dd0: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
9de0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
9df0: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
9e00: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
9e10: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
9e20: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
9e30: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9e40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9e50: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
9e60: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
9e70: 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d  char *zIn, Colum
9e80: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20  n *pCol){.  u32 
9e90: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
9ea0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
9eb0: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
9ec0: 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b  char *zChar = 0;
9ed0: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21  ..  assert( zIn!
9ee0: 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a  =0 );.  while( z
9ef0: 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d  In[0] ){.    h =
9f00: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
9f10: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a  3UpperToLower[(*
9f20: 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20  zIn)&0xff];.    
9f30: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
9f40: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
9f50: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9f60: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
9f70: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
9f80: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9f90: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9fa0: 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20    zChar = zIn;. 
9fb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9fc0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
9fd0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
9fe0: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
9ff0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
a000: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
a010: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
a020: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
a030: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
a040: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
a050: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
a060: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
a070: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
a080: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
a090: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
a0a0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
a0b0: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
a0c0: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
a0d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a0e0: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
a0f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
a100: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
a110: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
a120: 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d      if( zIn[0]==
a130: 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49  '(' ) zChar = zI
a140: 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n;.#ifndef SQLIT
a150: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
a160: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
a170: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
a180: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
a190: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
a1a0: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
a1b0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
a1c0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
a1d0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
a1e0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
a1f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
a200: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
a210: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
a220: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
a230: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
a240: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
a250: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
a260: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
a270: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
a280: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
a290: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
a2a0: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
a2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
a2c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
a2d0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a2e0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
a2f0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a300: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
a310: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
a320: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
a330: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
a340: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
a350: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
a360: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
a370: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
a380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a390: 2a 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74  * If pCol is not
a3a0: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
a3b0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
a3c0: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
a3d0: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
a3e0: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
a3f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
a400: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
a410: 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a  /.  if( pCol ){.
a420: 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20      int v = 0;  
a430: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
a440: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
a450: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
a460: 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  f<SQLITE_AFF_NUM
a470: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66  ERIC ){.      if
a480: 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20  ( zChar ){.     
a490: 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b     while( zChar[
a4a0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
a4b0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67  if( sqlite3Isdig
a4c0: 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a  it(zChar[0]) ){.
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
a4e0: 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28  LOB(k), VARCHAR(
a4f0: 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72  k), CHAR(k) -> r
a500: 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20  =(k/4+1) */.    
a510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
a520: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
a530: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
a540: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a550: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
a560: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
a570: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a580: 20 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f       v = 16;   /
a590: 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c  * BLOB, TEXT, CL
a5a0: 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72  OB -> r=5  (appr
a5b0: 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20  ox 20 bytes)*/. 
a5c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
a5d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a5e0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
a5f0: 43 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73  CES.    if( v>=s
a600: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
a610: 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29  ig.szSorterRef )
a620: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  {.      pCol->co
a630: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a640: 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20  G_SORTERREF;.   
a650: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20   }.#endif.    v 
a660: 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69  = v/4 + 1;.    i
a670: 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32  f( v>255 ) v = 2
a680: 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  55;.    pCol->sz
a690: 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  Est = v;.  }.  r
a6a0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
a6b0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
a6c0: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
a6d0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
a6e0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
a6f0: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
a700: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
a710: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
a720: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
a730: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
a740: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
a750: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
a760: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
a770: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
a780: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
a790: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a7a0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
a7b0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
a7c0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
a7d0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
a7e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a7f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a800: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
a810: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a820: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
a830: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a840: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
a850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
a860: 20 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72   The parsed expr
a870: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65  ession of the de
a880: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20  fault value */. 
a890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
a8a0: 61 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61  art,      /* Sta
a8b0: 72 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  rt of the defaul
a8c0: 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a  t value text */.
a8d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
a8e0: 6e 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  nd         /* Fi
a8f0: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61  rst character pa
a900: 73 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74  st end of defaut
a910: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29   value text */.)
a920: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
a930: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
a940: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a950: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20  arse->db;.  p = 
a960: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a970: 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  e;.  if( p!=0 ){
a980: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
a990: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
a9a0: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
a9b0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a9c0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
a9d0: 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  r, db->init.busy
a9e0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
a9f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
aa00: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
aa10: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
aa20: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
aa30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
aa40: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
aa50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
aa60: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
aa70: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
aa80: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
aa90: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
aaa0: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
aab0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
aac0: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
aad0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
aae0: 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71  Expr x;.      sq
aaf0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ab00: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
ab10: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
ab20: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
ab30: 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54  ;.      x.op = T
ab40: 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e  K_SPAN;.      x.
ab50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74  u.zToken = sqlit
ab60: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
ab70: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
ab80: 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70       x.pLeft = p
ab90: 45 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c  Expr;.      x.fl
aba0: 61 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20  ags = EP_Skip;. 
abb0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
abc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
abd0: 70 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55  p(db, &x, EXPRDU
abe0: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
abf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ac00: 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  b, x.u.zToken);.
ac10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ac20: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
ac30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
ac40: 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70  enameExprUnmap(p
ac50: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
ac60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
ac70: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
ac80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b  );.}../*.** Back
ac90: 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c  wards Compatibil
aca0: 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a  ity Hack:.** .**
acb0: 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73   Historical vers
acc0: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
acd0: 63 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20  ccepted strings 
ace0: 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  as column names 
acf0: 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e  in.** indexes an
ad00: 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  d PRIMARY KEY co
ad10: 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e  nstraints and in
ad20: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
ad30: 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  nts.  Example:.*
ad40: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
ad50: 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c  TABLE xyz(a,b,c,
ad60: 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28  d,e,PRIMARY KEY(
ad70: 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c  'a'),UNIQUE('b',
ad80: 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d  'c' COLLATE trim
ad90: 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  ).**     CREATE 
ada0: 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a  INDEX abc ON xyz
adb0: 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65  ('c','d' DESC,'e
adc0: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
add0: 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68   DESC);.**.** Th
ade0: 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75  is is goofy.  Bu
adf0: 74 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61  t to preserve ba
ae00: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
ae10: 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75  ility we continu
ae20: 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69  e to.** accept i
ae30: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
ae40: 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73   does the necess
ae50: 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20  ary conversion. 
ae60: 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20   It converts.** 
ae70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67  the expression g
ae80: 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75  iven in its argu
ae90: 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53  ment from a TK_S
aea0: 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f  TRING into a TK_
aeb0: 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70  ID.** if the exp
aec0: 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20  ression is just 
aed0: 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68  a TK_STRING with
aee0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c   an optional COL
aef0: 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  LATE clause..** 
af00: 49 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f  If the epxressio
af10: 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  n is anything ot
af20: 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49  her than TK_STRI
af30: 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  NG, the expressi
af40: 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  on is.** unchang
af50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
af60: 69 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67  id sqlite3String
af70: 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20  ToId(Expr *p){. 
af80: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
af90: 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e  TRING ){.    p->
afa0: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65  op = TK_ID;.  }e
afb0: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
afc0: 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e  K_COLLATE && p->
afd0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  pLeft->op==TK_ST
afe0: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70  RING ){.    p->p
aff0: 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44  Left->op = TK_ID
b000: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
b010: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
b020: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
b030: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
b040: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
b050: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
b060: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
b070: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
b080: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
b090: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
b0a0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
b0b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
b0c0: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
b0d0: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
b0e0: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
b0f0: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
b100: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
b110: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
b120: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
b130: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
b140: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
b150: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
b160: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
b170: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
b180: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
b190: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
b1a0: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
b1b0: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
b1c0: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
b1d0: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
b1e0: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
b1f0: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
b200: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
b210: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
b220: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
b230: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
b240: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
b250: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
b260: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
b270: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
b280: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
b290: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b2a0: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
b2b0: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
b2c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b2d0: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
b2e0: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
b2f0: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
b300: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
b310: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
b320: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
b330: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b340: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
b350: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b360: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b370: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
b380: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
b390: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
b3a0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
b3b0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
b3c0: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
b3d0: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
b3e0: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
b3f0: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
b400: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
b410: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
b420: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
b430: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
b440: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
b450: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
b460: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
b470: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
b480: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
b490: 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d  ewTable;.  Colum
b4a0: 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
b4b0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
b4c0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
b4d0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
b4e0: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
b4f0: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
b500: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
b510: 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a  asPrimaryKey ){.
b520: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b530: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
b540: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
b550: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
b560: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
b570: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
b580: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
b590: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
b5a0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
b5b0: 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  = TF_HasPrimaryK
b5c0: 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  ey;.  if( pList=
b5d0: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
b5e0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
b5f0: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61  .    pCol = &pTa
b600: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
b610: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
b620: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
b630: 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20  MKEY;.    nTerm 
b640: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
b650: 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d    nTerm = pList-
b660: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
b670: 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
b680: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b690: 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
b6a0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
b6b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
b6c0: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
b6d0: 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20  ( pCExpr!=0 );. 
b6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69       sqlite3Stri
b6f0: 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a  ngToId(pCExpr);.
b700: 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72        if( pCExpr
b710: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
b720: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
b730: 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78  r *zCName = pCEx
b740: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
b750: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
b760: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
b770: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
b780: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
b790: 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c  3StrICmp(zCName,
b7a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
b7b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
b7c0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
b7d0: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
b7e0: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ol];.           
b7f0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
b800: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
b810: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY;.            
b820: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b830: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b840: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b850: 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20   if( nTerm==1.  
b860: 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73   && pCol.   && s
b870: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71  qlite3StrICmp(sq
b880: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
b890: 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47  pCol,""), "INTEG
b8a0: 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f  ER")==0.   && so
b8b0: 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f  rtOrder!=SQLITE_
b8c0: 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20  SO_DESC.  ){.   
b8d0: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
b8e0: 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29  BJECT && pList )
b8f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
b900: 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28  enameTokenRemap(
b910: 70 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69  pParse, &pTab->i
b920: 50 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  PKey, pList->a[0
b930: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
b940: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
b950: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
b960: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
b970: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
b980: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
b990: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
b9a0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
b9b0: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
b9c0: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
b9d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
b9e0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
b9f0: 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61  Order = pList->a
ba00: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
ba10: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
ba20: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
ba30: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
ba40: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
ba50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ba60: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
ba70: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
ba80: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
ba90: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
baa0: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
bab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
bac0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
bad0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
bae0: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
baf0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c  0, sortOrder, 0,
bb20: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
bb30: 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20  PRIMARYKEY);.   
bb40: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
bb50: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
bb60: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
bb70: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
bb80: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
bb90: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
bba0: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
bbb0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
bbc0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
bbd0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
bbe0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
bbf0: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
bc00: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
bc10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
bc20: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bc30: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
bc40: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
bc50: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
bc60: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
bc70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
bc80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
bc90: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
bca0: 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le;.  sqlite3 *d
bcb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
bcc0: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49    if( pTab && !I
bcd0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20  N_DECLARE_VTAB. 
bce0: 20 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72    && !sqlite3Btr
bcf0: 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d  eeIsReadonly(db-
bd00: 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44  >aDb[db->init.iD
bd10: 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20  b].pBt).  ){.   
bd20: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
bd30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
bd40: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54  ppend(pParse, pT
bd50: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65  ab->pCheck, pChe
bd60: 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ckExpr);.    if(
bd70: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
bd80: 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20  intName.n ){.   
bd90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
bda0: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
bdb0: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
bdc0: 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  &pParse->constra
bdd0: 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  intName, 1);.   
bde0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
bdf0: 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
be00: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
be10: 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78  se->db, pCheckEx
be20: 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pr);.  }.}../*.*
be30: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
be40: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
be50: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
be60: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
be70: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
be80: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
be90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
bea0: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
beb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
bec0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61  n *pToken){.  Ta
bed0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
bee0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  .  char *zColl; 
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf00: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
bf10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
bf20: 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nce */.  sqlite3
bf30: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20   *db;..  if( (p 
bf40: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
bf50: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
bf60: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
bf70: 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  1;.  db = pParse
bf80: 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20  ->db;.  zColl = 
bf90: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
bfa0: 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
bfb0: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
bfc0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
bfd0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
bfe0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
bff0: 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ll) ){.    Index
c000: 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69   *pIdx;.    sqli
c010: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
c020: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b  >aCol[i].zColl);
c030: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
c040: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
c050: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
c060: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
c070: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
c080: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
c090: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
c0a0: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
c0b0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
c0c0: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
c0d0: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
c0e0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
c0f0: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
c100: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
c110: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
c120: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c130: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
c140: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c150: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
c160: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65  ssert( pIdx->nKe
c170: 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  yCol==1 );.     
c180: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
c190: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
c1a0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
c1b0: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
c1c0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
c1d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c1e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c1f0: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
c200: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
c210: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
c220: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
c230: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
c240: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
c250: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
c260: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
c270: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
c280: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
c290: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
c2a0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
c2b0: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
c2c0: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
c2d0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
c2e0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
c2f0: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
c300: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
c310: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
c320: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
c330: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
c340: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
c350: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
c360: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
c370: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
c380: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
c390: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
c3a0: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
c3b0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
c3c0: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
c3d0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
c3e0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
c3f0: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
c400: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
c410: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
c420: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
c430: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
c440: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c450: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
c460: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
c470: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
c480: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
c490: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
c4a0: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
c4b0: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
c4c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
c4d0: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
c4e0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
c4f0: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
c500: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
c510: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
c520: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
c530: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c540: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
c550: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
c560: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
c570: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
c580: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
c590: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
c5a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c5b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
c5c0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
c5d0: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
c5e0: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
c5f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
c600: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c610: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c620: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
c630: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
c640: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
c650: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
c660: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
c670: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
c680: 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c  Seq(pParse, enc,
c690: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
c6a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
c6b0: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
c6c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c6d0: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
c6e0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
c6f0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
c700: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
c710: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
c720: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
c730: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
c740: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
c750: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
c760: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
c770: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
c780: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
c790: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
c7a0: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
c7b0: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
c7c0: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
c7d0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
c7e0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
c7f0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
c800: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
c810: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
c820: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
c830: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
c840: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
c850: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
c860: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
c870: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
c880: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
c890: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
c8a0: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
c8b0: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
c8c0: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
c8d0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
c8e0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
c8f0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
c900: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
c910: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
c920: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
c930: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
c940: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
c950: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
c960: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
c970: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
c980: 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50  nough..**.** IMP
c990: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
c9a0: 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51  R-34230-56049 SQ
c9b0: 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  Lite automatical
c9c0: 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a  ly increments.**
c9d0: 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73   the schema-vers
c9e0: 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65  ion whenever the
c9f0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
ca00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ca10: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
ca20: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
ca30: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
ca40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ca50: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
ca60: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
ca70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
ca80: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
ca90: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
caa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cab0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
cac0: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48  , iDb, BTREE_SCH
cad0: 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20  EMA_VERSION, .  
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e   (int)(1+(unsign
cb00: 65 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ed)db->aDb[iDb].
cb10: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
cb20: 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  cookie));.}../*.
cb30: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
cb40: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
cb50: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
cb60: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
cb70: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
cb80: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
cb90: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
cba0: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
cbb0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
cbc0: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
cbd0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
cbe0: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
cbf0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
cc00: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
cc10: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
cc20: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
cc30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
cc40: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
cc50: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
cc60: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
cc70: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
cc80: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
cc90: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
cca0: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
ccb0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
ccc0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
ccd0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
cce0: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
ccf0: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
cd00: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
cd10: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
cd20: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
cd30: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
cd40: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
cd50: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
cd60: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
cd70: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
cd80: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
cd90: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
cda0: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
cdb0: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
cdc0: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
cdd0: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
cde0: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
cdf0: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
ce00: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
ce10: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
ce20: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
ce30: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
ce40: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
ce50: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
ce60: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
ce70: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
ce80: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
ce90: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
cea0: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
ceb0: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
cec0: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
ced0: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
cee0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
cef0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
cf00: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
cf10: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
cf20: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
cf30: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
cf40: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
cf50: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
cf60: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
cf70: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
cf80: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
cf90: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
cfa0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
cfb0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
cfc0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
cfd0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
cfe0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
cff0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
d000: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
d010: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
d020: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
d030: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
d040: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
d050: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
d060: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
d070: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
d080: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
d090: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
d0a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
d0b0: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
d0c0: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
d0d0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
d0e0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
d0f0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
d100: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
d110: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
d120: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
d130: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
d140: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
d150: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
d160: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
d170: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
d180: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
d190: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
d1a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
d1b0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
d1c0: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
d1d0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
d1e0: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
d1f0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
d200: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
d210: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
d220: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
d230: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
d240: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
d250: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
d260: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
d270: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
d280: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
d290: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
d2a0: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
d2b0: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
d2c0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
d2d0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
d2e0: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
d2f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
d300: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
d310: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
d320: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
d330: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
d340: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
d350: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
d360: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
d370: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
d380: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
d390: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
d3a0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
d3b0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
d3c0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
d3d0: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
d3e0: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
d3f0: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
d400: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
d410: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
d420: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
d430: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
d440: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
d450: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
d460: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
d470: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
d480: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
d490: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
d4a0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
d4b0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
d4c0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
d4d0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
d4e0: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
d4f0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
d500: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
d510: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
d520: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
d530: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
d540: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20  QLITE_AFF_BLOB  
d550: 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20    */ "",.       
d560: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   /* SQLITE_AFF_T
d570: 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54  EXT    */ " TEXT
d580: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
d590: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
d5a0: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
d5b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
d5c0: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
d5d0: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
d5e0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
d5f0: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
d600: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
d610: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d620: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
d630: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
d640: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
d650: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
d660: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
d670: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
d680: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
d690: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
d6a0: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
d6b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d6c0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
d6d0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d  LITE_AFF_BLOB >=
d6e0: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
d6f0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d700: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
d710: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
d720: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
d730: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d740: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d750: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73  _BLOB );.    tes
d760: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d770: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d780: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
d790: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
d7a0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d7b0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
d7c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
d7d0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d7e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
d7f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
d800: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
d810: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
d820: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
d830: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
d840: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
d850: 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20  TE_AFF_BLOB];.  
d860: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
d870: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
d880: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
d890: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d8a0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20  TE_AFF_BLOB .   
d8b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
d8c0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
d8d0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
d8e0: 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20  zType, 0) );.   
d8f0: 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b   memcpy(&zStmt[k
d900: 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a  ], zType, len);.
d910: 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20      k += len;.  
d920: 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29    assert( k<=n )
d930: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d940: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
d950: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
d960: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
d970: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Stmt;.}../*.** R
d980: 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f  esize an Index o
d990: 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20  bject to hold N 
d9a0: 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20  columns total.  
d9b0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
d9c0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
d9d0: 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  nd SQLITE_NOMEM 
d9e0: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  on an OOM error.
d9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
da00: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
da10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
da20: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e  dex *pIdx, int N
da30: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  ){.  char *zExtr
da40: 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  a;.  int nByte;.
da50: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
da60: 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20  umn>=N ) return 
da70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
da80: 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73  ert( pIdx->isRes
da90: 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79  ized==0 );.  nBy
daa0: 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61  te = (sizeof(cha
dab0: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36  r*) + sizeof(i16
dac0: 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74  ) + 1)*N;.  zExt
dad0: 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ra = sqlite3DbMa
dae0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
daf0: 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72  te);.  if( zExtr
db00: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
db10: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
db20: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
db30: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20  , pIdx->azColl, 
db40: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49  sizeof(char*)*pI
db50: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
db60: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
db70: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78  const char**)zEx
db80: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
db90: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e   sizeof(char*)*N
dba0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
dbb0: 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  a, pIdx->aiColum
dbc0: 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70  n, sizeof(i16)*p
dbd0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
dbe0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
dbf0: 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a  = (i16*)zExtra;.
dc00: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
dc10: 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d  of(i16)*N;.  mem
dc20: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
dc30: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49  ->aSortOrder, pI
dc40: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
dc50: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
dc60: 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a   = (u8*)zExtra;.
dc70: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
dc80: 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52  = N;.  pIdx->isR
dc90: 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65  esized = 1;.  re
dca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dcb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
dcc0: 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20  e the total row 
dcd0: 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c  width for a tabl
dce0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
dcf0: 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57  d estimateTableW
dd00: 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62  idth(Table *pTab
dd10: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54  ){.  unsigned wT
dd20: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  able = 0;.  cons
dd30: 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f  t Column *pTabCo
dd40: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  l;.  int i;.  fo
dd50: 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  r(i=pTab->nCol, 
dd60: 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
dd70: 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  ol; i>0; i--, pT
dd80: 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54  abCol++){.    wT
dd90: 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d  able += pTabCol-
dda0: 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66  >szEst;.  }.  if
ddb0: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
ddc0: 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54  ) wTable++;.  pT
ddd0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
dde0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61  qlite3LogEst(wTa
ddf0: 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble*4);.}../*.**
de00: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
de10: 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20  erage size of a 
de20: 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  row for an index
de30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
de40: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
de50: 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dth(Index *pIdx)
de60: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e  {.  unsigned wIn
de70: 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  dex = 0;.  int i
de80: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
de90: 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70   *aCol = pIdx->p
dea0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66  Table->aCol;.  f
deb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
dec0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
ded0: 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d     i16 x = pIdx-
dee0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
def0: 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78    assert( x<pIdx
df00: 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29  ->pTable->nCol )
df10: 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20  ;.    wIndex += 
df20: 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70  x<0 ? 1 : aCol[p
df30: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
df40: 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70  ].szEst;.  }.  p
df50: 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  Idx->szIdxRow = 
df60: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49  sqlite3LogEst(wI
df70: 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52  ndex*4);.}../* R
df80: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61  eturn true if va
df90: 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61  lue x is found a
dfa0: 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ny of the first 
dfb0: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20  nCol entries of 
dfc0: 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69  aiCol[].*/.stati
dfd0: 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28  c int hasColumn(
dfe0: 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c  const i16 *aiCol
dff0: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20  , int nCol, int 
e000: 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f  x){.  while( nCo
e010: 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d  l-- > 0 ) if( x=
e020: 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65  =*(aiCol++) ) re
e030: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
e040: 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70   0;.}../* Recomp
e050: 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64  ute the colNotId
e060: 78 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  xed field of the
e070: 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f   Index..**.** co
e080: 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62  lNotIdxed is a b
e090: 69 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20  itmask that has 
e0a0: 61 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e  a 0 bit represen
e0b0: 74 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65  ting each indexe
e0c0: 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  d.** columns tha
e0d0: 74 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  t are within the
e0e0: 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
e0f0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  s of the table. 
e100: 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64   The.** high-ord
e110: 65 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74  er bit of colNot
e120: 49 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20  Idxed is always 
e130: 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65  1.  All unindexe
e140: 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  d columns.** of 
e150: 74 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61  the table have a
e160: 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f   1..**.** The co
e170: 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69  lNotIdxed mask i
e180: 73 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68  s AND-ed with th
e190: 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f  e SrcList.a[].co
e1a0: 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f  lUsed mask.** to
e1b0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
e1c0: 65 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72  e index is cover
e1d0: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ing index..*/.st
e1e0: 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70  atic void recomp
e1f0: 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64  uteColumnsNotInd
e200: 65 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78  exed(Index *pIdx
e210: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  ){.  Bitmask m =
e220: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
e230: 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(j=pIdx->nColu
e240: 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
e250: 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49  {.    int x = pI
e260: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
e270: 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b  .    if( x>=0 ){
e280: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e290: 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20   x==BMS-1 );.   
e2a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
e2b0: 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69  BMS-2 );.      i
e2c0: 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c  f( x<BMS-1 ) m |
e2d0: 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20  = MASKBIT(x);.  
e2e0: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e    }.  }.  pIdx->
e2f0: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d  colNotIdxed = ~m
e300: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
e310: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e  x->colNotIdxed>>
e320: 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a  63)==1 );.}../*.
e330: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e340: 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20  runs at the end 
e350: 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  of parsing a CRE
e360: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e370: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  ent that.** has 
e380: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
e390: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62  clause.  The job
e3a0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
e3b0: 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62   is to convert b
e3c0: 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  oth.** internal 
e3d0: 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75  schema data stru
e3e0: 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67  ctures and the g
e3f0: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
e400: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a  de so that they.
e410: 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ** are appropria
e420: 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  te for a WITHOUT
e430: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73   ROWID table ins
e440: 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20  tead of a rowid 
e450: 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65  table..** Change
e460: 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  s include:.**.**
e470: 20 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c       (1)  Set al
e480: 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
e490: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68   PRIMARY KEY sch
e4a0: 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  ema object to be
e4b0: 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20   NOT NULL..**   
e4c0: 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50    (2)  Convert P
e4d0: 33 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74  3 parameter of t
e4e0: 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  he OP_CreateBtre
e4f0: 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54  e from BTREE_INT
e500: 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  KEY .**         
e510: 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42   into BTREE_BLOB
e520: 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  KEY..**     (3) 
e530: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
e540: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
e550: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e560: 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  entry.**        
e570: 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52    for the PRIMAR
e580: 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69  Y KEY as the pri
e590: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
e5a0: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
e5b0: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
e5c0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e5d0: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
e5e0: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
e5f0: 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  f..**     (4)  S
e600: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
e610: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
e620: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
e630: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
e640: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
e650: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
e660: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
e670: 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64  .**     (5)  Add
e680: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e690: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e6a0: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
e6b0: 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  ct.**          s
e6c0: 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41  o that the PRIMA
e6d0: 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65  RY KEY is a cove
e6e0: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65  ring index.  The
e6f0: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20   surplus.**     
e700: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65       columns are
e710: 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f   part of KeyInfo
e720: 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61  .nAllField and a
e730: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
e740: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
e750: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
e760: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
e770: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
e780: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
e790: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
e7a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
e7b0: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
e7c0: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
e7d0: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
e7e0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
e7f0: 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c  *.** For virtual
e800: 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31   tables, only (1
e810: 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  ) is performed..
e820: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e830: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
e840: 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20  owidTable(Parse 
e850: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
e860: 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
e870: 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pIdx;.  Index *p
e880: 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20  Pk;.  int nPk;. 
e890: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
e8a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e8b0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
e8c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e8d0: 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65  ;..  /* Mark eve
e8e0: 72 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ry PRIMARY KEY c
e8f0: 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c  olumn as NOT NUL
e900: 4c 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d  L (except for im
e910: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20  poster tables). 
e920: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
e930: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
e940: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
e950: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
e960: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e970: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63  (pTab->aCol[i].c
e980: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
e990: 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b  G_PRIMKEY)!=0 ){
e9a0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
e9b0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
e9c0: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20   OE_Abort;.     
e9d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
e9e0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50  /* Convert the P
e9f0: 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  3 operand of the
ea00: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20   OP_CreateBtree 
ea10: 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45  opcode from BTRE
ea20: 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e  E_INTKEY.  ** in
ea30: 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  to BTREE_BLOBKEY
ea40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
ea50: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29  rse->addrCrTab )
ea60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20  {.    assert( v 
ea70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ea80: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50  beChangeP3(v, pP
ea90: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c  arse->addrCrTab,
eaa0: 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b   BTREE_BLOBKEY);
eab0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
eac0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
ead0: 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66  Y index.  Or, if
eae0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20   this table was 
eaf0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
eb00: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
eb10: 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72  RY KEY table, cr
eb20: 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41  eate a new PRIMA
eb30: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20  RY KEY index. . 
eb40: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
eb50: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
eb60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
eb70: 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f  .    Token ipkTo
eb80: 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ken;.    sqlite3
eb90: 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f  TokenInit(&ipkTo
eba0: 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ken, pTab->aCol[
ebb0: 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
ebc0: 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
ebd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ebe0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
ebf0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ec00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ec10: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
ec20: 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b   &ipkToken, 0));
ec30: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
ec40: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ec50: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
ec60: 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Order = pParse->
ec70: 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  iPkSortOrder;.  
ec80: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
ec90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61  ->pNewTable==pTa
eca0: 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b );.    sqlite3
ecb0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
ecc0: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
ecd0: 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e  st, pTab->keyCon
ece0: 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  f, 0, 0, 0, 0,. 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58        SQLITE_IDX
ed10: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29  TYPE_PRIMARYKEY)
ed20: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
ed30: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
ed40: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
ed50: 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73  urn;.    pPk = s
ed60: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
ed70: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
ed80: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
ed90: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
eda0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
edb0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
edc0: 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  b);.    assert( 
edd0: 70 50 6b 21 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  pPk!=0 );..    /
ede0: 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20  *.    ** Remove 
edf0: 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  all redundant co
ee00: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50  lumns from the P
ee10: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
ee20: 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65   example, change
ee30: 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59  .    ** "PRIMARY
ee40: 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62   KEY(a,b,a,b,c,b
ee50: 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74  ,c,d)" into just
ee60: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
ee70: 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a  b,c,d)".  Later.
ee80: 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75      ** code assu
ee90: 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  mes the PRIMARY 
eea0: 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  KEY contains no 
eeb0: 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73  repeated columns
eec0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
eed0: 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e  (i=j=1; i<pPk->n
eee0: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
eef0: 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
ef00: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
ef10: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
ef20: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
ef30: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b   pPk->nColumn--;
ef40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ef50: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
ef60: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
ef70: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
ef80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
ef90: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
efa0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
efb0: 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e  Pk!=0 );.  pPk->
efc0: 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a  isCovering = 1;.
efd0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
efe0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20  imposterTable ) 
eff0: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
f000: 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50   = 1;.  nPk = pP
f010: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
f020: 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65  * Bypass the cre
f030: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49  ation of the PRI
f040: 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61  MARY KEY btree a
f050: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  nd the sqlite_ma
f060: 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
f070: 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f  entry. This is o
f080: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20  nly required if 
f090: 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61  currently genera
f0a0: 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63  ting VDBE.  ** c
f0b0: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
f0c0: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
f0d0: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
f0e0: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
f0f0: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
f100: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69  schema).  */.  i
f110: 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75  f( v && pPk->tnu
f120: 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  m>0 ){.    asser
f130: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
f140: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
f150: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
f160: 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c  de(v, pPk->tnum,
f170: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a   OP_Goto);.  }..
f180: 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
f190: 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ge of the PRIMAR
f1a0: 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62  Y KEY is the tab
f1b0: 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  le root page */.
f1c0: 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54    pPk->tnum = pT
f1d0: 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20  ab->tnum;..  /* 
f1e0: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
f1f0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
f200: 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55  ion of all UNIQU
f210: 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e  E indices by con
f220: 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  verting.  ** the
f230: 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c   final rowid col
f240: 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  umn into one or 
f250: 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
f260: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
f270: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
f280: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
f290: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f2a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
f2b0: 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69  n;.    if( IsPri
f2c0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
f2d0: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
f2e0: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
f2f0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
f300: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
f310: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
f320: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
f330: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
f340: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
f350: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
f360: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
f370: 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20  x is a superset 
f380: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
f390: 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78  ey */.      pIdx
f3a0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78  ->nColumn = pIdx
f3b0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
f3c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
f3d0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
f3e0: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
f3f0: 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  Idx, pIdx->nKeyC
f400: 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol+n) ) return;.
f410: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70      for(i=0, j=p
f420: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c  Idx->nKeyCol; i<
f430: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
f440: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
f450: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
f460: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
f470: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
f480: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
f490: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20  ->aiColumn[j] = 
f4a0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
f4b0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
f4c0: 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d  azColl[j] = pPk-
f4d0: 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
f4e0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
f4f0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
f500: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
f510: 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  >=pIdx->nKeyCol+
f520: 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n );.    assert(
f530: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
f540: 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  j );.  }..  /* A
f550: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
f560: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
f570: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
f580: 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61  */.  if( nPk<pTa
f590: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69  b->nCol ){.    i
f5a0: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
f5b0: 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54  ject(db, pPk, pT
f5c0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75  ab->nCol) ) retu
f5d0: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
f5e0: 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e   j=nPk; i<pTab->
f5f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f600: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
f610: 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
f620: 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  j, i) ){.       
f630: 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e   assert( j<pPk->
f640: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
f650: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
f660: 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  [j] = i;.       
f670: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
f680: 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
f690: 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  RY;.        j++;
f6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f6b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
f6c0: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
f6d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
f6e0: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
f6f0: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
f700: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
f710: 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d 70 75  l;.  }.  recompu
f720: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
f730: 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 23 69 66  xed(pPk);.}..#if
f740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f750: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f760: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
f770: 69 66 20 7a 4e 61 6d 65 20 69 73 20 61 20 73 68  if zName is a sh
f780: 61 64 6f 77 20 74 61 62 6c 65 20 6e 61 6d 65 20  adow table name 
f790: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
f7a0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
f7b0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61  ction..**.** zNa
f7c0: 6d 65 20 69 73 20 74 65 6d 70 6f 72 61 72 69 6c  me is temporaril
f7d0: 79 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65  y modified while
f7e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f7f0: 20 72 75 6e 6e 69 6e 67 2c 20 62 75 74 20 69 73   running, but is
f800: 0a 2a 2a 20 72 65 73 74 6f 72 65 64 20 74 6f 20  .** restored to 
f810: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  its original val
f820: 75 65 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ue prior to this
f830: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 69   routine returni
f840: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
f850: 74 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  t isShadowTableN
f860: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
f870: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
f880: 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b 20 20 20   char *zTail;   
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8a0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
f8b0: 20 6c 61 73 74 20 22 5f 22 20 69 6e 20 7a 4e 61   last "_" in zNa
f8c0: 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
f8d0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
f8e0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
f8f0: 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 73  hat zName is a s
f900: 68 61 64 6f 77 20 6f 66 20 2a 2f 0a 20 20 4d 6f  hadow of */.  Mo
f910: 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20 20 20 20  dule *pMod;     
f920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
f930: 6f 64 75 6c 65 20 66 6f 72 20 74 68 65 20 76 69  odule for the vi
f940: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a  rtual table */..
f950: 20 20 7a 54 61 69 6c 20 3d 20 73 74 72 72 63 68    zTail = strrch
f960: 72 28 7a 4e 61 6d 65 2c 20 27 5f 27 29 3b 0a 20  r(zName, '_');. 
f970: 20 69 66 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20   if( zTail==0 ) 
f980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 7a 54 61  return 0;.  *zTa
f990: 69 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 20 3d  il = 0;.  pTab =
f9a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
f9b0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  e(db, zName, 0);
f9c0: 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 27 5f 27 3b  .  *zTail = '_';
f9d0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
f9e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f9f0: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
fa00: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
fa10: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
fa20: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
fa30: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 70 54  &db->aModule, pT
fa40: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
fa50: 30 5d 29 3b 0a 20 20 69 66 28 20 70 4d 6f 64 3d  0]);.  if( pMod=
fa60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fa70: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75   if( pMod->pModu
fa80: 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 3c 33 20 29  le->iVersion<3 )
fa90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
faa0: 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e   pMod->pModule->
fab0: 78 53 68 61 64 6f 77 4e 61 6d 65 3d 3d 30 20 29  xShadowName==0 )
fac0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
fad0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  urn pMod->pModul
fae0: 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 28 7a  e->xShadowName(z
faf0: 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65 6c 73 65  Tail+1);.}.#else
fb00: 0a 23 20 64 65 66 69 6e 65 20 69 73 53 68 61 64  .# define isShad
fb10: 6f 77 54 61 62 6c 65 4e 61 6d 65 28 78 2c 79 29  owTableName(x,y)
fb20: 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e   0.#endif /* ifn
fb30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fb40: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
fb50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fb60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
fb70: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
fb80: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
fb90: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
fba0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
fbb0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
fbc0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
fbd0: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
fbe0: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
fbf0: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
fc00: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
fc10: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
fc20: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
fc30: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
fc40: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
fc50: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
fc60: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
fc70: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
fc80: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
fc90: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
fca0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
fcb0: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
fcc0: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
fcd0: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
fce0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
fcf0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
fd00: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
fd10: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
fd20: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
fd30: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
fd40: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
fd50: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
fd60: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
fd70: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
fd80: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
fd90: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
fda0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
fdb0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
fdc0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
fdd0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
fde0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
fdf0: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
fe00: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
fe10: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
fe20: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
fe30: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
fe40: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
fe50: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
fe60: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
fe70: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
fe80: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
fe90: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
fea0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
feb0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
fec0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
fed0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
fee0: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
fef0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
ff00: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
ff10: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
ff20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
ff30: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
ff40: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
ff50: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
ff60: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
ff70: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
ff80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27        /* The ')'
ff90: 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20   before options 
ffa0: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
ffb0: 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f  BLE */.  u8 tabO
ffc0: 70 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  pts,            
ffd0: 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20   /* Extra table 
ffe0: 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79  options. Usually
fff0: 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   0. */.  Select 
10000 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
10010 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
10020 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
10030 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
10040 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20   Table *p;      
10050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10060 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
10070 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10080 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
10090 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
100a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
100b0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
100c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
100d0 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61   in which the ta
100e0 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49  ble lives */.  I
100f0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
10100 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
10110 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20  mplied index of 
10120 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  the table */..  
10130 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70  if( pEnd==0 && p
10140 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
10150 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
10160 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
10170 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20  ocFailed );.  p 
10180 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
10190 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
101a0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
101b0 20 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 69   pSelect==0 && i
101c0 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65  sShadowTableName
101d0 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20 29  (db, p->zName) )
101e0 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67  {.    p->tabFlag
101f0 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b 0a  s |= TF_Shadow;.
10200 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10210 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
10220 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
10230 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
10240 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
10250 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
10260 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
10270 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
10280 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
10290 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
102a0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
102b0 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
102c0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
102d0 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
102e0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
102f0 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
10300 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
10310 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
10320 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
10330 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
10340 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
10350 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine.).  **.  ** 
10360 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
10370 20 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68   number is 1, th
10380 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73  at means this is
10390 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
103a0 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74  er.  ** table it
103b0 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69  self.  So mark i
103c0 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a  t read-only..  *
103d0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
103e0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28  .busy ){.    if(
103f0 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
10400 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10410 67 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20  g(pParse, "");. 
10420 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10430 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d   }.    p->tnum =
10440 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
10450 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e  m;.    if( p->tn
10460 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c  um==1 ) p->tabFl
10470 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e  ags |= TF_Readon
10480 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ly;.  }..  /* Sp
10490 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
104a0 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
104b0 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69  ID Tables */.  i
104c0 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f  f( tabOpts & TF_
104d0 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  WithoutRowid ){.
104e0 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
104f0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
10500 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20  crement) ){.    
10510 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10520 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
10530 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45      "AUTOINCREME
10540 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  NT not allowed o
10550 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
10560 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
10570 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
10580 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
10590 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
105a0 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
105b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
105c0 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d  sg(pParse, "PRIM
105d0 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20  ARY KEY missing 
105e0 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  on table %s", p-
105f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
10600 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
10610 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
10620 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f  outRowid | TF_No
10630 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
10640 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74      convertToWit
10650 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70  houtRowidTable(p
10660 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
10670 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71  .  }..  iDb = sq
10680 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
10690 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
106a0 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
106b0 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
106c0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
106d0 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
106e0 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
106f0 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
10700 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
10710 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
10720 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
10730 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43  Parse, p, NC_IsC
10740 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65  heck, 0, p->pChe
10750 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ck);.  }.#endif 
10760 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10770 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
10780 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  /..  /* Estimate
10790 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77   the average row
107a0 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61   size for the ta
107b0 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20  ble and for all 
107c0 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20  implied indices 
107d0 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62  */.  estimateTab
107e0 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f  leWidth(p);.  fo
107f0 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
10800 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10810 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65  x->pNext){.    e
10820 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
10830 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20  h(pIdx);.  }..  
10840 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
10850 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
10860 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
10870 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
10880 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
10890 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
108a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
108b0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
108c0 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
108d0 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
108e0 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
108f0 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
10900 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
10910 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
10920 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
10930 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
10940 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
10950 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
10960 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
10970 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
10980 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
10990 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
109a0 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
109b0 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
109c0 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
109d0 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
109e0 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
109f0 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
10a00 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
10a10 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10a20 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e  arse);.    if( N
10a30 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
10a40 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
10a50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10a60 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
10a70 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
10a80 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
10a90 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
10aa0 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
10ab0 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
10ac0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
10ad0 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
10ae0 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
10af0 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
10b00 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
10b10 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
10b20 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
10b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
10b40 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
10b50 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
10b60 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
10b70 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
10b80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10b90 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
10ba0 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
10bb0 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
10bc0 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
10bd0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
10be0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
10bf0 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
10c00 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
10c10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
10c20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
10c30 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
10c40 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
10c50 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
10c60 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
10c70 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
10c80 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
10c90 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
10ca0 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
10cb0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
10cc0 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
10cd0 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
10ce0 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
10cf0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
10d00 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
10d10 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
10d20 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
10d30 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
10d40 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
10d50 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
10d60 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
10d70 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
10d80 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
10d90 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
10da0 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
10db0 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
10dc0 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
10dd0 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
10de0 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
10df0 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
10e00 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
10e10 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
10e20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72  dest;    /* Wher
10e30 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f  e the SELECT sho
10e40 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74  uld store result
10e50 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
10e60 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f  egYield;       /
10e70 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
10e80 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e  ng co-routine en
10e90 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  try-point */.   
10ea0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
10eb0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
10ec0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
10ed0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
10ee0 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
10ef0 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69  A record to be i
10f00 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e  nsert into the n
10f10 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ew table */.    
10f20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20    int regRowid; 
10f30 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f        /* Rowid o
10f40 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74  f the next row t
10f50 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  o insert */.    
10f60 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f    int addrInsLoo
10f70 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  p;    /* Top of 
10f80 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73  the loop for ins
10f90 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erting rows */. 
10fa0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
10fb0 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61  Tab;     /* A ta
10fc0 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ble that describ
10fd0 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  es the SELECT re
10fe0 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  sults */..      
10ff0 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61  regYield = ++pPa
11000 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
11010 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72   regRec = ++pPar
11020 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
11030 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
11040 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
11050 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
11060 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
11070 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
11080 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
11090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
110a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
110b0 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
110c0 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
110d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
110e0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
110f0 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20  P2ISREG);.      
11100 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
11110 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
11120 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
11130 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
11140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11150 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
11160 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
11170 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54  gYield, 0, addrT
11180 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  op);.      if( p
11190 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
111a0 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c  turn;.      pSel
111b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
111c0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
111d0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
111e0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54  .      if( pSelT
111f0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
11200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11210 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
11220 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
11230 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
11240 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
11250 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
11260 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
11270 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
11280 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
11290 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
112a0 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
112b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
112c0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
112d0 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
112e0 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
112f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
11300 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
11310 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
11320 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
11330 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
11340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
11350 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
11360 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  egYield);.      
11370 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11380 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d  ere(v, addrTop -
11390 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49   1);.      addrI
113a0 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
113b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
113c0 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
113d0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
113e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
113f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11400 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
11410 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
11420 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
11430 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
11440 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
11450 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
11460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11470 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
11480 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
11490 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
114a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
114b0 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
114c0 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
114d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114e0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73  eGoto(v, addrIns
114f0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
11500 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11510 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
11520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11530 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11540 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Close, 1);.    }
11550 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
11560 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
11570 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
11580 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11590 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
115a0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
115b0 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
115c0 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
115d0 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
115e0 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
115f0 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
11600 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
11610 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
11620 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
11630 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
11640 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
11650 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
11660 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
11670 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
11680 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
11690 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
116a0 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
116b0 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
116c0 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
116d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
116e0 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
116f0 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
11700 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
11710 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
11720 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
11730 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
11740 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
11750 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
11760 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
11770 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
11780 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
11790 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
117a0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
117b0 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
117c0 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
117d0 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
117e0 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
117f0 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
11800 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
11810 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
11820 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
11830 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
11840 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
11850 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
11860 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11870 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11880 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
11890 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
118a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
118b0 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
118c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
118d0 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
118e0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
118f0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
11900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11910 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
11920 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
11930 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
11940 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
11950 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
11960 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
11970 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
11980 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
11990 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
119a0 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
119b0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
119c0 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  ment)!=0 ){.    
119d0 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
119e0 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
119f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11a00 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
11a10 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
11a20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
11a30 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
11a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
11a50 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
11a60 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11a70 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
11a80 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
11a90 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
11aa0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44           pDb->zD
11ab0 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  bSName.        )
11ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11ad0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
11ae0 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
11af0 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
11b00 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
11b10 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
11b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
11b30 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72  rseSchemaOp(pPar
11b40 73 65 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  se, iDb,.       
11b50 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
11b60 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
11b70 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d  ='%q' AND type!=
11b80 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a  'trigger'", p->z
11b90 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20  Name));.  }...  
11ba0 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
11bb0 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
11bc0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
11bd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11be0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
11bf0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
11c00 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
11c10 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
11c20 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
11c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
11c40 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
11c50 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
11c60 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
11c70 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
11c80 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
11c90 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b  h, p->zName, p);
11ca0 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
11cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11cc0 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
11cd0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
11ce0 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
11cf0 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
11d00 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11d10 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
11d20 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
11d30 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11d40 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d  e = 0;.    db->m
11d50 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
11d60 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
11d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11d80 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
11d90 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
11da0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
11db0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
11dc0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
11dd0 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
11de0 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
11df0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
11e00 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
11e10 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
11e20 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
11e30 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
11e40 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
11e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
11e60 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e  ame = (int)((con
11e70 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d  st char *)pCons-
11e80 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >z - zName);.   
11e90 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
11ea0 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
11eb0 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
11ec0 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
11ed0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
11ee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ef0 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
11f00 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
11f10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
11f20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
11f30 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
11f40 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
11f50 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
11f60 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
11f70 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
11f80 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
11f90 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
11fa0 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
11fb0 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
11fc0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
11fd0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
11fe0 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
11ff0 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
12000 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
12010 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
12020 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
12030 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
12040 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
12050 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  w */.  ExprList 
12060 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74  *pCNames, /* Opt
12070 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69  ional list of vi
12080 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ew column names 
12090 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
120a0 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
120b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
120c0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
120d0 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
120e0 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
120f0 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
12100 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
12110 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
12120 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
12130 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
12140 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
12150 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
12160 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
12170 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
12180 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
12190 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
121a0 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
121b0 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
121c0 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
121d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
121e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
121f0 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
12200 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12210 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
12220 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
12230 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
12240 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
12250 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71  w_fail;.  }.  sq
12260 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
12270 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
12280 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
12290 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
122a0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
122b0 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
122c0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
122d0 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  r ) goto create_
122e0 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c  view_fail;.  sql
122f0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
12300 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
12310 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
12320 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
12330 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
12340 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
12350 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
12360 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
12370 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
12380 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
12390 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
123a0 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74  , pSelect) ) got
123b0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
123c0 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  il;..  /* Make a
123d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
123e0 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
123f0 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
12400 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
12410 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
12420 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
12430 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
12440 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
12450 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
12460 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
12470 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
12480 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
12490 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
124a0 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
124b0 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
124c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
124d0 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
124e0 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  /.  if( IN_RENAM
124f0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
12500 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
12510 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63  lect;.    pSelec
12520 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
12530 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
12540 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
12550 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
12560 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
12570 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20    }.  p->pCheck 
12580 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12590 74 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73  tDup(db, pCNames
125a0 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
125b0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
125c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
125d0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
125e0 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  l;..  /* Locate 
125f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
12600 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
12610 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
12620 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
12630 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
12640 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
12650 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  astToken;.  asse
12660 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  rt( sEnd.z[0]!=0
12670 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b   || sEnd.n==0 );
12680 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
12690 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
126a0 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
126b0 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
126c0 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
126d0 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
126e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
126f0 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  );.  z = pBegin-
12700 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  >z;.  while( sql
12710 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
12720 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
12730 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
12740 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
12750 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
12760 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
12770 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
12780 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
12790 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
127a0 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
127b0 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c  se, 0, &sEnd, 0,
127c0 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65   0);..create_vie
127d0 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65  w_fail:.  sqlite
127e0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
127f0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  , pSelect);.  if
12800 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
12810 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CT ){.    sqlite
12820 33 52 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55  3RenameExprlistU
12830 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 43 4e  nmap(pParse, pCN
12840 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ames);.  }.  sql
12850 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
12860 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b  te(db, pCNames);
12870 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
12880 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12890 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20  IT_VIEW */..#if 
128a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
128b0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
128c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
128d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
128e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
128f0 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
12900 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
12910 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
12920 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
12930 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
12940 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
12950 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
12960 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
12970 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
12980 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
12990 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
129a0 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
129b0 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
129c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
129d0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
129e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
129f0 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
12a00 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
12a10 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
12a20 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
12a30 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
12a40 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
12a50 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
12a60 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
12a70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
12a80 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
12a90 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
12aa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
12ab0 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
12ac0 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
12ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
12ae0 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
12af0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
12b00 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20  rs assigned */. 
12b10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12b20 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
12b30 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12b40 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72  on for malloc er
12b50 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rors */.#ifndef 
12b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12b70 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 72  UALTABLE.  int r
12b80 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  c;.#endif.#ifnde
12b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12ba0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71  THORIZATION.  sq
12bb0 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
12bc0 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
12bd0 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
12be0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
12bf0 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
12c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c10 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12c20 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  .  db->nSchemaLo
12c30 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ck++;.  rc = sql
12c40 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e  ite3VtabCallConn
12c50 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
12c60 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65  le);.  db->nSche
12c70 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20  maLock--;.  if( 
12c80 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
12c90 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73   1;.  }.  if( Is
12ca0 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
12cb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
12cc0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
12cd0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
12ce0 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
12cf0 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
12d00 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
12d10 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
12d20 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
12d30 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
12d40 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
12d50 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
12d60 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
12d70 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
12d80 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
12d90 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
12da0 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
12db0 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
12dc0 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
12dd0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
12de0 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
12df0 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
12e00 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
12e10 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
12e20 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
12e30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
12e40 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
12e50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
12e60 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
12e70 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
12e80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
12e90 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
12ea0 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
12eb0 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
12ec0 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
12ed0 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
12ee0 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
12ef0 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
12f00 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
12f10 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
12f20 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
12f30 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
12f40 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
12f50 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
12f60 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
12f70 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
12f80 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
12f90 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
12fa0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
12fb0 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
12fc0 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
12fd0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
12fe0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12ff0 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
13000 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
13010 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
13020 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
13030 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
13040 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
13050 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
13060 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
13070 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
13080 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
13090 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
130a0 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
130b0 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
130c0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
130d0 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
130e0 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
130f0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
13100 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
13110 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
13120 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
13130 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
13140 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
13150 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
13160 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
13170 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
13180 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
13190 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
131a0 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
131b0 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
131c0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
131d0 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
131e0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
131f0 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
13200 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
13210 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
13220 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
13230 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
13240 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  el ){.#ifndef SQ
13250 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
13260 41 42 4c 45 0a 20 20 20 20 75 38 20 65 50 61 72  ABLE.    u8 ePar
13270 73 65 4d 6f 64 65 20 3d 20 70 50 61 72 73 65 2d  seMode = pParse-
13280 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20  >eParseMode;.   
13290 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
132a0 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45  ode = PARSE_MODE
132b0 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a  _NORMAL;.#endif.
132c0 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
132d0 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
132e0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
132f0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
13300 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
13310 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
13320 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
13330 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a  ide.bDisable++;.
13340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13350 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
13360 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
13370 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
13380 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
13390 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
133a0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
133b0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
133c0 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
133d0 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20  = xAuth;.#else. 
133e0 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
133f0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
13400 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
13410 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
13420 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
13430 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
13440 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
13450 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
13460 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41   name(arglist) A
13470 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54  S ....      ** T
13480 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
13490 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
134a0 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66  able are taken f
134b0 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  rom.      ** arg
134c0 6c 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74  list which is st
134d0 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e  ored in pTable->
134e0 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68  pCheck.  The pCh
134f0 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20  eck field.      
13500 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64  ** normally hold
13510 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  s CHECK constrai
13520 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61  nts on an ordina
13530 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f  ry table, but fo
13540 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45  r.      ** a VIE
13550 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c  W it holds the l
13560 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ist of column na
13570 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mes..      */.  
13580 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
13590 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
135a0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70  Parse, pTable->p
135b0 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65           &pTable
135e0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d  ->nCol, &pTable-
135f0 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66  >aCol);.      if
13600 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13610 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ed==0 .       &&
13620 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
13630 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c  .       && pTabl
13640 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70  e->nCol==pSel->p
13650 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20  EList->nExpr.   
13660 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
13670 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
13680 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
13690 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
136a0 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ble, pSel);.    
136b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
136c0 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
136d0 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45     /* CREATE VIE
136e0 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69  W name AS...  wi
136f0 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e  thout an argumen
13700 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75  t list.  Constru
13710 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ct.      ** the 
13720 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
13730 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  m the SELECT sta
13740 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
13750 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
13760 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13770 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
13780 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
13790 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
137a0 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
137b0 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
137c0 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
137d0 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
137e0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
137f0 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
13800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13810 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
13820 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
13830 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
13840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13850 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
13860 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
13870 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
13880 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
13890 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
138a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
138b0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
138c0 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
138d0 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23  de.bDisable--;.#
138e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
138f0 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
13900 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65    pParse->eParse
13910 4d 6f 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64  Mode = eParseMod
13920 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c  e;.#endif.  } el
13930 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
13940 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70  .  }.  pTable->p
13950 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c  Schema->schemaFl
13960 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
13970 74 56 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62  tViews;.  if( db
13980 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  {.    sqlite3Del
139a0 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
139b0 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
139c0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
139d0 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
139e0 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  ol = 0;.  }.#end
139f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13a00 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
13a10 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
13a20 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
13a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13a40 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13a50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13a60 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
13a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13a80 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
13a90 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
13aa0 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
13ab0 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
13ac0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
13ad0 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
13ae0 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
13af0 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
13b00 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
13b10 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
13b20 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
13b30 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
13b40 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
13b50 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
13b60 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
13b70 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
13b80 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
13b90 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
13ba0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
13bb0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
13bc0 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
13bd0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
13be0 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
13bf0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
13c00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13c10 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
13c20 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  s(db, pTab);.   
13c30 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20     pTab->aCol = 
13c40 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
13c50 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
13c60 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
13c70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
13c80 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
13c90 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
13ca0 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
13cb0 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
13cc0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
13cd0 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
13ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13cf0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
13d00 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
13d10 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
13d20 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
13d30 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
13d40 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
13d50 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
13d60 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
13d70 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
13d80 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
13d90 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
13da0 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
13db0 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
13dc0 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
13dd0 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
13de0 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
13df0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
13e00 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
13e10 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
13e20 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
13e30 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
13e40 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
13e50 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
13e60 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
13e70 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
13e80 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
13e90 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
13ea0 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
13eb0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
13ec0 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
13ed0 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
13ee0 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
13ef0 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
13f00 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
13f10 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
13f20 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
13f30 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
13f40 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
13f50 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
13f60 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
13f70 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
13f80 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
13f90 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
13fa0 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
13fb0 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
13fc0 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
13fd0 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
13fe0 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
13ff0 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
14000 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
14010 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
14020 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
14030 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
14040 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
14050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14060 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
14070 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
14080 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
14090 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f  nt iDb, int iFro
140a0 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
140b0 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
140c0 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20    Hash *pHash;. 
140d0 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
140e0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
140f0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
14100 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62  iDb, 0) );.  pDb
14110 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
14120 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ;.  pHash = &pDb
14130 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
14140 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
14150 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
14160 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
14170 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
14180 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
14190 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
141a0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
141b0 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
141c0 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
141d0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
141e0 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
141f0 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
14200 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
14210 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
14220 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
14230 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
14240 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
14250 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
14260 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
14270 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
14280 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
14290 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
142a0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
142b0 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
142c0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
142d0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
142e0 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
142f0 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
14300 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
14310 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
14320 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
14330 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
14340 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
14350 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
14360 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
14370 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
14380 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
14390 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
143a0 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
143b0 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
143c0 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
143d0 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
143e0 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
143f0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
14400 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
14410 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14420 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
14430 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
14440 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14450 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
14460 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
14470 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
14480 20 69 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20   if( iTable<2 ) 
14490 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
144a0 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
144b0 20 73 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c   schema");.  sql
144c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
144d0 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
144e0 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
144f0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
14500 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
14510 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14520 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
14530 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
14540 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
14550 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
14560 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
14570 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
14580 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
14590 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
145a0 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
145b0 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
145c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
145d0 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
145e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
145f0 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
14600 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
14610 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
14620 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
14630 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
14640 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
14650 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
14660 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
14670 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
14680 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
14690 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
146a0 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
146b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
146c0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
146d0 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
146e0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
146f0 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
14700 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
14710 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
14720 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
14730 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
14740 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
14750 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
14760 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
14770 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
14780 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14790 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
147a0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
147b0 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
147c0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
147d0 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
147e0 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
147f0 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
14800 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
14810 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
14820 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
14830 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
14840 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
14850 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
14860 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
14870 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
14880 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
14890 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
148a0 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
148b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
148c0 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
148d0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
148e0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
148f0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
14900 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
14910 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
14920 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
14930 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
14940 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
14950 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
14960 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
14970 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
14980 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
14990 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
149a0 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
149b0 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
149c0 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
149d0 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
149e0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
149f0 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
14a00 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
14a10 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
14a20 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
14a30 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
14a40 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
14a50 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
14a60 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
14a70 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
14a80 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
14a90 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
14aa0 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
14ab0 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
14ac0 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
14ad0 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
14ae0 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
14af0 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
14b00 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
14b10 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
14b20 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
14b30 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
14b40 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
14b50 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
14b60 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
14b70 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
14b80 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
14b90 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
14ba0 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
14bb0 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
14bc0 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
14bd0 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
14be0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
14bf0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
14c00 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
14c10 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
14c20 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
14c30 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
14c40 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
14c50 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
14c60 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
14c70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
14c80 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14c90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
14ca0 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
14cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14cc0 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
14cd0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
14ce0 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
14cf0 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
14d00 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
14d10 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
14d20 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
14d30 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
14d40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14d50 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
14d60 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
14d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
14d80 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
14d90 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
14da0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
14db0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61  Schema);.      a
14dc0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
14dd0 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
14de0 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65  >nDb );.      de
14df0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
14e00 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
14e10 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
14e20 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
14e30 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
14e40 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74  /*.** Remove ent
14e50 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71  ries from the sq
14e60 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
14e70 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32  s (for N in (1,2
14e80 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20  ,3)).** after a 
14e90 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52  DROP INDEX or DR
14ea0 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
14eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14ec0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
14ed0 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65  tTables(.  Parse
14ee0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14ef0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
14f00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
14f10 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
14f20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
14f30 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
14f40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
14f50 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22  pe,     /* "idx"
14f60 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63   or "tbl" */.  c
14f70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
14f80 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14f90 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
14fa0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
14fb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14fc0 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64  Name = pParse->d
14fd0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
14fe0 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Name;.  for(i=1;
14ff0 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=4; i++){.   
15000 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a   char zTab[24];.
15010 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
15020 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62  intf(sizeof(zTab
15030 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73  ),zTab,"sqlite_s
15040 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69  tat%d",i);.    i
15050 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
15060 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
15070 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29  zTab, zDbName) )
15080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
15090 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
150a0 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
150b0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
150c0 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
150d0 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
150e0 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  b, zType, zName.
150f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
15100 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
15110 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
15120 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
15130 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
15140 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
15150 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
15160 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
15170 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
15180 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
15190 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
151a0 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
151b0 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
151c0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
151d0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
151e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
151f0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
15200 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
15210 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
15220 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
15230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15240 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
15250 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
15260 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
15270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
15280 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
15290 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
152a0 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
152b0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
152c0 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
152d0 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
152e0 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
152f0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
15300 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
15310 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
15320 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
15330 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
15340 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
15350 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
15360 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
15370 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
15380 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
15390 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
153a0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
153b0 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
153c0 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
153d0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
153e0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
153f0 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
15400 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
15410 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
15420 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
15430 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
15440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15450 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
15460 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
15470 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
15480 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
15490 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
154a0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
154b0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
154c0 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
154d0 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
154e0 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
154f0 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
15500 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
15510 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
15520 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
15530 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
15540 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
15550 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
15560 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
15570 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
15580 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
15590 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
155a0 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
155b0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
155c0 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
155d0 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
155e0 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
155f0 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
15600 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c    pDb->zDbSName,
15610 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
15620 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
15630 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
15640 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
15650 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
15660 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
15670 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  o the.  ** table
15680 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
15690 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
156a0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
156b0 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
156c0 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
156d0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
156e0 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
156f0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
15700 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70  being.  ** dropp
15710 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
15720 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
15730 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
15740 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a  igger can be.  *
15750 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
15760 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
15770 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
15780 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
15790 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  .  ** database..
157a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
157b0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
157c0 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  , .      "DELETE
157d0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
157e0 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
157f0 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
15800 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  '",.      pDb->z
15810 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
15820 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  NAME, pTab->zNam
15830 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
15840 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
15850 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
15860 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
15870 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
15880 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
15890 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
158a0 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
158b0 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
158c0 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
158d0 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
158e0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
158f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
15900 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15910 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
15920 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
15930 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
15940 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
15950 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
15960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15970 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
15980 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
15990 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  ->zName, 0);.  s
159a0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
159b0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
159c0 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
159d0 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
159e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
159f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
15a00 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
15a10 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
15a20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
15a30 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
15a40 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
15a50 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
15a60 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
15a70 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
15a80 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
15a90 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
15aa0 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
15ab0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
15ac0 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
15ad0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15ae0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
15af0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15b00 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
15b10 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15b20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
15b30 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
15b40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
15b50 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
15b60 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
15b70 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
15b80 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15b90 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72  able;.  if( noEr
15ba0 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
15bb0 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  Err++;.  assert(
15bc0 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73   isView==0 || is
15bd0 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45  View==LOCATE_VIE
15be0 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  W );.  pTab = sq
15bf0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
15c00 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56  Item(pParse, isV
15c10 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30  iew, &pName->a[0
15c20 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  ]);.  if( noErr 
15c30 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
15c40 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  r--;..  if( pTab
15c50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
15c60 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f  oErr ) sqlite3Co
15c70 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
15c80 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
15c90 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
15ca0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
15cb0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
15cc0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
15cd0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
15ce0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
15cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
15d00 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
15d10 44 62 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Db );.  sqlite3S
15d20 63 68 65 6d 61 57 72 69 74 61 62 6c 65 28 70 50  chemaWritable(pP
15d30 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 20 20 2f  arse, iDb);..  /
15d40 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
15d50 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
15d60 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
15d70 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
15d80 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
15d90 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
15da0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
15db0 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
15dc0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
15dd0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
15de0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
15df0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
15e00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15e10 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
15e20 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
15e30 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
15e40 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
15e50 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
15e60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15e70 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
15e80 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
15e90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
15ea0 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
15eb0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15ec0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
15ed0 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
15ee0 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
15ef0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
15f00 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
15f10 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
15f20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
15f30 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
15f40 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
15f50 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
15f60 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
15f70 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
15f80 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
15f90 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
15fa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15fb0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
15fc0 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
15fd0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15fe0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
15ff0 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
16000 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
16010 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
16020 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
16030 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
16040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
16050 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
16060 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
16070 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
16080 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
16090 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
160a0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
160b0 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
160c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
160d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
160e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
160f0 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
16100 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
16110 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
16120 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
16130 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
16140 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16150 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
16160 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
16170 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
16180 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16190 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
161a0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
161b0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
161c0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
161d0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
161e0 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
161f0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
16200 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c  , "sqlite_stat",
16210 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   11)!=0 ){.    s
16220 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16230 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
16240 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
16250 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
16260 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
16270 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
16280 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16290 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
162a0 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
162b0 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
162c0 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
162d0 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
162e0 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
162f0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
16300 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
16310 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
16320 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16330 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
16340 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
16350 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
16360 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
16370 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
16380 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
16390 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
163a0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
163b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
163c0 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
163d0 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
163e0 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
163f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
16400 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
16410 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
16420 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16430 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
16440 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
16450 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
16460 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
16470 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
16480 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16490 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
164a0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
164b0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
164c0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  1, iDb);.    if(
164d0 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
164e0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
164f0 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
16500 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61   iDb, "tbl", pTa
16510 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
16520 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61   sqlite3FkDropTa
16530 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
16540 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
16550 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44      sqlite3CodeD
16560 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
16570 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69   pTab, iDb, isVi
16580 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ew);.  }..exit_d
16590 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
165a0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
165b0 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
165c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
165d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
165e0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
165f0 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
16600 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
16610 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
16620 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
16630 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
16640 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
16650 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
16660 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
16670 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
16680 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
16690 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
166a0 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
166b0 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
166c0 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
166d0 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
166e0 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28  le referred to (
166f0 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e  a.k.a the "paren
16700 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43  t" table).  pToC
16710 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20  ol is a list.** 
16720 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
16730 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c   parent pTo tabl
16740 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  e.  flags contai
16750 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
16760 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
16770 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
16780 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
16790 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
167a0 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
167b0 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
167c0 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
167d0 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
167e0 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
167f0 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
16800 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
16810 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
16820 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
16830 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
16840 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  e field..**.** T
16850 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
16860 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
16870 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
16880 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
16890 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
168a0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
168b0 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
168c0 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
168d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
168e0 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
168f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16900 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
16910 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16920 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
16930 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
16940 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
16950 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
16960 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
16970 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
16980 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
16990 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
169a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
169b0 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
169c0 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
169d0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
169e0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
169f0 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
16a00 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
16a10 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  s. */.){.  sqlit
16a20 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16a30 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
16a40 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
16a50 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
16a60 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a  ey = 0;.  FKey *
16a70 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65  pNextTo;.  Table
16a80 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
16a90 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
16aa0 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
16ab0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
16ac0 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
16ad0 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
16ae0 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c   p==0 || IN_DECL
16af0 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
16b00 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
16b10 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
16b20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
16b30 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e  Col-1;.    if( N
16b40 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67  EVER(iCol<0) ) g
16b50 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
16b60 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
16b70 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
16b80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
16b90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16ba0 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
16bb0 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
16bc0 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
16bd0 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
16be0 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
16bf0 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
16c00 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
16c10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
16c20 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
16c30 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
16c40 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
16c50 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
16c60 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
16c70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16c80 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
16c90 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
16ca0 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
16cb0 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
16cc0 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
16cd0 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
16ce0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
16cf0 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
16d00 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
16d10 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
16d20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
16d30 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
16d40 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
16d50 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  Key) + (nCol-1)*
16d60 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
16d70 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
16d80 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
16d90 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
16da0 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
16db0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
16dc0 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
16dd0 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
16de0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
16df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
16e00 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
16e10 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
16e20 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
16e30 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  y==0 ){.    goto
16e40 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70   fk_end;.  }.  p
16e50 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
16e60 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
16e70 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
16e80 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
16e90 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b  Key->aCol[nCol];
16ea0 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
16eb0 7a 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  z;.  if( IN_RENA
16ec0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
16ed0 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
16ee0 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
16ef0 76 6f 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20  void*)z, pTo);. 
16f00 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70   }.  memcpy(z, p
16f10 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
16f20 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
16f30 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
16f40 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f  e(z);.  z += pTo
16f50 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
16f60 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
16f70 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
16f80 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
16f90 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
16fa0 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
16fb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16fc0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
16fd0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
16fe0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
16ff0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
17000 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
17010 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
17020 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
17030 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
17040 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
17050 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
17060 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
17070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
17080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17090 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
170a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
170b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
170c0 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
170d0 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
170e0 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
170f0 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
17100 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
17110 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
17120 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
17130 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
17140 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
17150 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
17160 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
17170 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72  eTokenRemap(pPar
17180 73 65 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c  se, &pFKey->aCol
17190 5b 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  [i], pFromCol->a
171a0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
171b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
171c0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
171d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
171e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
171f0 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
17200 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
17210 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
17220 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
17230 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
17240 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
17250 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  BJECT ){.       
17260 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
17270 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c  kenRemap(pParse,
17280 20 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d   z, pToCol->a[i]
17290 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
172a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
172b0 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
172c0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
172d0 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
172e0 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
172f0 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
17300 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
17310 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20  Key->aAction[0] 
17320 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30  = (u8)(flags & 0
17330 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20  xff);           
17340 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63   /* ON DELETE ac
17350 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  tion */.  pFKey-
17360 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75  >aAction[1] = (u
17370 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29  8)((flags >> 8 )
17380 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20   & 0xff);    /* 
17390 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
173a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
173b0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
173c0 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e  xHeld(db, 0, p->
173d0 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e  pSchema) );.  pN
173e0 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29  extTo = (FKey *)
173f0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
17400 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  t(&p->pSchema->f
17410 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20  keyHash, .      
17420 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69  pFKey->zTo, (voi
17430 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20  d *)pFKey.  );. 
17440 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46   if( pNextTo==pF
17450 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
17460 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
17470 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
17480 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
17490 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
174a0 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
174b0 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
174c0 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
174d0 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
174e0 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
174f0 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
17500 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
17510 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
17520 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
17530 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
17540 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
17550 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
17560 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
17570 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
17580 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
17590 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
175a0 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
175b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
175c0 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
175d0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
175e0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
175f0 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
17600 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
17610 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
17620 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
17630 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
17640 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
17650 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
17660 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
17670 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
17680 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
17690 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
176a0 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
176b0 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
176c0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
176d0 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
176e0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
176f0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
17700 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
17710 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
17720 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
17730 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
17740 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
17750 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
17760 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
17770 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17780 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
17790 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
177a0 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
177b0 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
177c0 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
177d0 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
177e0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
177f0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
17800 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
17810 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
17820 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
17830 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
17840 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
17850 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
17860 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
17870 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
17880 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
17890 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
178a0 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
178b0 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
178c0 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
178d0 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
178e0 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
178f0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
17900 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
17910 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
17920 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
17930 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
17940 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
17950 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
17960 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
17970 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
17980 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
17990 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
179a0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
179b0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
179c0 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
179d0 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
179e0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
179f0 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
17a00 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
17a10 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
17a20 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
17a30 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
17a40 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
17a50 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
17a60 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
17a70 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
17a80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
17a90 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
17aa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
17ab0 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
17ac0 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
17ad0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17ae0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
17af0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
17b00 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
17b10 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
17b20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
17b30 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
17b40 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
17b50 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
17b60 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
17b70 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
17b80 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
17b90 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
17ba0 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
17bb0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
17bc0 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
17bd0 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
17be0 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
17bf0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
17c00 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17c10 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
17c20 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b   */.  int addr2;
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17c50 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e  to jump to for n
17c60 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
17c70 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c90 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17ca0 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
17cb0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20   iPartIdxLabel; 
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
17cd0 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
17ce0 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20  l to skip a row 
17cf0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
17d20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
17d30 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
17d40 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
17d50 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
17d60 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
17d70 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  r index */.  int
17d80 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
17d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17da0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
17db0 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20  assembled index 
17dc0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
17dd0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
17de0 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
17df0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
17e00 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
17e10 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
17e20 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
17e30 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
17e40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17e50 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
17e60 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
17e70 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
17e80 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
17e90 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
17ea0 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
17eb0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20  b[iDb].zDbSName 
17ec0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
17ed0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17ee0 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
17ef0 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
17f00 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
17f10 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
17f20 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
17f30 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
17f40 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
17f50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
17f60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
17f70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
17f80 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
17f90 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
17fa0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
17fb0 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
17fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
17fd0 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
17fe0 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  um;.  }.  pKey =
17ff0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
18000 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
18010 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74  Index);.  assert
18020 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d  ( pKey!=0 || db-
18030 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
18040 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
18050 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
18060 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66  sorter cursor if
18070 20 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f   we are to use o
18080 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72  ne. */.  iSorter
18090 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
180a0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
180b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
180c0 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72  terOpen, iSorter
180d0 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  , 0, pIndex->nKe
180e0 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20  yCol, (char*).  
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18100 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
18110 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45  Ref(pKey), P4_KE
18120 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70  YINFO);..  /* Op
18130 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f  en the table. Lo
18140 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72  op through all r
18150 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
18160 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65  , inserting inde
18170 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69  x.  ** records i
18180 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20  nto the sorter. 
18190 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  */.  sqlite3Open
181a0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
181b0 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
181c0 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
181d0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
181e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
181f0 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
18200 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18210 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
18220 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
18230 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
18240 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70  ite3MultiWrite(p
18250 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74  Parse);..  sqlit
18260 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
18270 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78  ey(pParse,pIndex
18280 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c  ,iTab,regRecord,
18290 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c  0,&iPartIdxLabel
182a0 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,0,0);.  sqlite3
182b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
182c0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69  _SorterInsert, i
182d0 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
182e0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  d);.  sqlite3Res
182f0 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
18300 28 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64  (pParse, iPartId
18310 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  xLabel);.  sqlit
18320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18330 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
18340 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
18350 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
18360 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
18370 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28  v, addr1);.  if(
18380 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29   memRootPage<0 )
18390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
183a0 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  p2(v, OP_Clear, 
183b0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71  tnum, iDb);.  sq
183c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
183d0 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
183e0 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62   iIdx, tnum, iDb
183f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
18400 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70         (char *)p
18410 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  Key, P4_KEYINFO)
18420 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
18430 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
18440 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52  G_BULKCSR|((memR
18450 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c  ootPage>=0)?OPFL
18460 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a  AG_P2ISREG:0));.
18470 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
18480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18490 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
184a0 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65  Sorter, 0); Vdbe
184b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69  Coverage(v);.  i
184c0 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
184d0 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
184e0 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33  int j2 = sqlite3
184f0 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a  VdbeGoto(v, 1);.
18500 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
18510 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
18520 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
18530 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
18540 74 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72  table(v, OE_Abor
18550 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
18560 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
18570 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  OP_SorterCompare
18580 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72  , iSorter, j2, r
18590 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43     pIndex->nKeyC
185c0 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
185d0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
185e0 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
185f0 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f  t(pParse, OE_Abo
18600 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  rt, pIndex);.   
18610 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18620 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d  Here(v, j2);.  }
18630 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20  else{.    addr2 
18640 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18650 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
18660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18670 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
18680 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20  rData, iSorter, 
18690 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29  regRecord, iIdx)
186a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
186b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp1(v, OP_Seek
186c0 45 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  End, iIdx);.  sq
186d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
186e0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
186f0 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64   iIdx, regRecord
18700 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18710 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
18720 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
18730 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
18740 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18750 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
18760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18770 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
18780 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
18790 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  dr2); VdbeCovera
187a0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
187b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
187c0 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
187d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
187e0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
187f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18800 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
18810 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
18820 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18830 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
18840 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
18850 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
18860 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
18870 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
18880 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
18890 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
188a0 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
188b0 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
188c0 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
188d0 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
188e0 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
188f0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
18900 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
18910 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
18920 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
18930 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
18940 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
18950 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
18960 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
18970 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
18980 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
18990 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
189a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
189b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
189c0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
189d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
189e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
189f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
18a00 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
18a10 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
18a20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
18a30 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
18a40 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
18a50 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
18a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18a70 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
18a80 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
18a90 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
18aa0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
18ab0 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
18ac0 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
18ad0 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
18ae0 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
18af0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
18b00 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
18b10 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
18b20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
18b30 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
18b40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
18b50 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
18b60 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
18b70 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
18b80 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49  ol+1) +     /* I
18b90 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74  ndex.aiRowLogEst
18ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
18bb0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31         sizeof(i1
18bc0 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  6)*nCol +       
18bd0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
18be0 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
18c00 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20  eof(u8)*nCol);  
18c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18c20 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
18c30 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  /.  p = sqlite3D
18c40 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
18c50 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b  nByte + nExtra);
18c60 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
18c70 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28  char *pExtra = (
18c80 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38  (char*)p)+ROUND8
18c90 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b  (sizeof(Index));
18ca0 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d  .    p->azColl =
18cb0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70   (const char**)p
18cc0 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
18cd0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
18ce0 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
18cf0 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20   p->aiRowLogEst 
18d00 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72  = (LogEst*)pExtr
18d10 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a  a; pExtra += siz
18d20 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
18d30 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43  l+1);.    p->aiC
18d40 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45  olumn = (i16*)pE
18d50 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74  xtra;       pExt
18d60 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
18d70 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  )*nCol;.    p->a
18d80 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
18d90 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e  )pExtra;.    p->
18da0 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
18db0 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d      p->nKeyCol =
18dc0 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a   nCol - 1;.    *
18dd0 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  ppExtra = ((char
18de0 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20  *)p) + nByte;.  
18df0 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
18e00 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
18e10 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
18e20 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
18e30 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
18e40 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
18e50 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
18e60 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
18e70 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
18e80 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
18e90 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
18ea0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
18eb0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18ec0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
18ed0 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
18ee0 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
18ef0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
18f00 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
18f10 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
18f20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18f30 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
18f40 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
18f50 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
18f60 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
18f70 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
18f80 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
18f90 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
18fa0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
18fb0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
18fc0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
18fd0 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
18fe0 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
18ff0 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
19000 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
19010 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
19020 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
19030 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
19040 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
19050 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
19060 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
19070 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
19080 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
19090 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
190a0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
190b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
190c0 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
190d0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
190e0 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
190f0 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
19100 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
19110 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
19120 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
19130 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
19140 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
19150 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
19160 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
19170 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
19180 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
19190 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
191a0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
191b0 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
191c0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
191d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
191e0 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
191f0 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
19200 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
19210 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
19220 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
19230 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
19240 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
19250 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
19260 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68  */.  Expr *pPIWh
19270 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45  ere,    /* WHERE
19280 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74   clause for part
19290 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ial indices */. 
192a0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
192b0 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
192c0 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
192d0 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
192e0 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
192f0 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69  Exist,    /* Omi
19300 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
19310 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
19320 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20  */.  u8 idxType 
19330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
19340 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  ndex type */.){.
19350 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
19360 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
19370 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
19380 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
19390 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
193a0 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
193b0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
193c0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
193d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
193e0 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
193f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19400 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
19410 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
19420 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62    int i, j;.  Db
19430 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
19440 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
19450 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
19460 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
19470 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
19480 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
19490 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
194a0 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
194b0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
194c0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
194d0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
194e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
194f0 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
19500 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
19510 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
19520 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
19530 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19540 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19550 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
19560 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
19570 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
19580 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
19590 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
195a0 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
195b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
195c0 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
195d0 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
195e0 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
195f0 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
19620 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
19630 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
19640 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
19650 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19660 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
19670 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
19680 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b  har *zExtra = 0;
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
196b0 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
196c0 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
196d0 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
196e0 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
196f0 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
19700 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
19710 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
19720 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
19730 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
19740 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19750 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
19760 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56  if( IN_DECLARE_V
19770 54 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d  TAB && idxType!=
19780 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
19790 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20  RIMARYKEY ){.   
197a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
197b0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
197c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
197d0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
197e0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
197f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19800 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
19810 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
19820 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
19830 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
19840 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
19850 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
19860 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
19870 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
19880 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
19890 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
198a0 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
198b0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
198c0 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
198d0 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
198e0 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
198f0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
19900 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
19910 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
19920 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
19930 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
19940 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
19950 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
19960 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
19970 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
19980 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
19990 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
199a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
199b0 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20  ame && pName->z 
199c0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
199d0 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
199e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
199f0 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
19a00 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
19a10 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
19a20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
19a30 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
19a40 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
19a50 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
19a60 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
19a70 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
19a80 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
19a90 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
19aa0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
19ab0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
19ac0 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
19ad0 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
19ae0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
19af0 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
19b00 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
19b10 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
19b20 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
19b30 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
19b40 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
19b50 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69     sqlite3FixIni
19b60 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
19b70 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
19b80 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
19b90 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
19ba0 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
19bb0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65  ) ){.      /* Be
19bc0 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
19bd0 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
19be0 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
19bf0 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
19c00 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
19c10 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
19c20 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
19c30 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
19c40 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
19c50 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
19c60 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
19c70 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d   &pTblName->a[0]
19c80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
19c90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
19ca0 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b  =0 || pTab==0 );
19cb0 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
19cc0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19cd0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
19ce0 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d  f( iDb==1 && db-
19cf0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
19d00 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a!=pTab->pSchema
19d10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19d20 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19d30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63  , .           "c
19d40 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54  annot create a T
19d50 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e  EMP index on non
19d60 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73  -TEMP table \"%s
19d70 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
19d80 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
19d90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19da0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19db0 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  }.    if( !HasRo
19dc0 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20  wid(pTab) ) pPk 
19dd0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
19de0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
19df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
19e00 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
19e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
19e20 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  art==0 );.    pT
19e30 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
19e40 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
19e50 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
19e60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19e70 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
19e80 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
19e90 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
19ea0 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
19eb0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
19ec0 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
19ed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19ee0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
19ef0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
19f00 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
19f10 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
19f20 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
19f30 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
19f40 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
19f50 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
19f60 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
19f70 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70  3UserAuthTable(p
19f80 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23  Tab->zName)==0.#
19f90 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
19fa0 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45  ITE_ALLOW_SQLITE
19fb0 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20  _MASTER_INDEX.  
19fc0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
19fd0 74 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  trICmp(&pTab->zN
19fe0 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29  ame[7],"master")
19ff0 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  !=0.#endif.     
1a000 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
1a010 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
1a020 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
1a030 2c 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73  ,9)!=0. ){.    s
1a040 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a050 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
1a060 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
1a070 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
1a080 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
1a090 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a0a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1a0b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
1a0c0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1a0d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1a0e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a0f0 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
1a100 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
1a110 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a120 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
1a130 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1a140 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a150 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
1a160 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1a170 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a180 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
1a190 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
1a1a0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
1a1b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a1c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1a1d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
1a1e0 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
1a1f0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
1a200 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
1a210 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
1a220 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
1a230 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
1a240 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
1a250 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
1a260 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
1a270 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
1a280 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
1a290 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
1a2a0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
1a2b0 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
1a2c0 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
1a2d0 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
1a2e0 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
1a2f0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
1a300 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
1a310 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
1a320 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
1a330 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
1a340 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
1a350 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
1a360 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
1a370 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
1a380 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
1a390 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
1a3a0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1a3b0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
1a3c0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1a3d0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
1a3e0 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
1a3f0 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
1a400 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
1a410 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1a420 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1a430 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
1a440 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
1a450 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a460 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
1a470 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20  pName->z!=0 );. 
1a480 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1a490 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
1a4a0 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
1a4b0 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
1a4c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a4d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1a4e0 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d     if( !IN_RENAM
1a4f0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1a500 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1a510 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  busy ){.        
1a520 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1a530 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
1a540 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
1a550 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a560 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
1a570 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
1a580 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
1a590 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1a5a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a5b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1a5c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a5d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1a5e0 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
1a5f0 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
1a600 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
1a610 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
1a620 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1a630 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1a640 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
1a650 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
1a660 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
1a670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a680 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
1a690 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
1a6a0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1a6b0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1a6c0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1a6d0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
1a6e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a6f0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1a700 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1a710 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
1a720 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
1a730 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
1a740 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
1a750 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
1a760 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
1a770 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1a780 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1a790 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
1a7a0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
1a7b0 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
1a7c0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
1a7d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1a7e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20  index;.    }..  
1a7f0 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
1a800 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72  ndex names gener
1a810 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ated from within
1a820 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1a830 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d  _vtab().    ** m
1a840 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74  ust have names t
1a850 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
1a860 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74   from normal aut
1a870 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
1a880 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  es..    ** The f
1a890 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
1a8a0 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c  nt converts "sql
1a8b0 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e  ite3_autoindex..
1a8c0 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22  ." into.    ** "
1a8d0 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65  sqlite3_butoinde
1a8e0 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74  x..." in order t
1a8f0 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73  o make the names
1a900 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a   distinct..    *
1a910 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e  * The "vtab_err.
1a920 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e  test" test demon
1a930 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64  strates the need
1a940 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   of this stateme
1a950 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  nt. */.    if( I
1a960 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
1a970 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20  ) zName[7]++;.  
1a980 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
1a990 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
1a9a0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
1a9b0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
1a9c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a9d0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
1a9e0 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
1a9f0 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  CT ){.    const 
1aa00 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
1aa10 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  >zDbSName;.    i
1aa20 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1aa30 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1aa40 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
1aa50 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
1aa60 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1aa70 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1aa80 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1aa90 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
1aaa0 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
1aab0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1aac0 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
1aad0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
1aae0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1aaf0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ab00 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
1ab10 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1ab20 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1ab30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1ab40 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
1ab50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1ab60 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
1ab70 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
1ab80 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
1ab90 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
1aba0 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
1abb0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
1abc0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
1abd0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1abe0 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
1abf0 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
1ac00 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
1ac10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
1ac20 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b  st==0 ){.    Tok
1ac30 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20  en prevCol;.    
1ac40 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26  Column *pCol = &
1ac50 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
1ac60 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43  >nCol-1];.    pC
1ac70 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
1ac80 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a  COLFLAG_UNIQUE;.
1ac90 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
1aca0 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70  Init(&prevCol, p
1acb0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
1acc0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1acd0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1ace0 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
1acf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ad00 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
1ad10 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29  ID, &prevCol, 0)
1ad20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1ad30 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1ad40 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1ad50 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1ad60 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
1ad70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1ad80 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69  SetSortOrder(pLi
1ad90 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a  st, sortOrder);.
1ada0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1adb0 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
1adc0 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
1add0 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b  pList, "index");
1ade0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
1adf0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
1ae00 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
1ae10 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
1ae20 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
1ae30 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
1ae40 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1ae50 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
1ae60 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ae70 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1ae80 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1ae90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1aea0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1aeb0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  Expr!=0 );.    i
1aec0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1aed0 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1aee0 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
1aef0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1af00 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1af10 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
1af20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
1af30 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
1af40 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
1af50 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
1af60 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
1af70 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50    nExtraCol = pP
1af80 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k ? pPk->nKeyCol
1af90 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d   : 1;.  pIndex =
1afa0 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
1afb0 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
1afc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
1afd0 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b000 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
1b010 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
1b020 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1b030 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1b040 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b050 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1b060 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1b070 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
1b080 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20  iRowLogEst) );. 
1b090 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1b0a0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
1b0b0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b  ndex->azColl) );
1b0c0 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
1b0d0 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78   = zExtra;.  zEx
1b0e0 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31  tra += nName + 1
1b0f0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
1b100 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
1b110 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
1b120 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
1b130 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  ab;.  pIndex->on
1b140 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
1b150 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75  ror;.  pIndex->u
1b160 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  niqNotNull = onE
1b170 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
1b180 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1b190 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49   = idxType;.  pI
1b1a0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
1b1b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1b1c0 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
1b1d0 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
1b1e0 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
1b1f0 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
1b200 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1b210 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1b220 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
1b230 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
1b240 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
1b250 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
1b260 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
1b270 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
1b280 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1b290 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1b2a0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
1b2b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1b2c0 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
1b2d0 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
1b2e0 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
1b2f0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1b300 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1b310 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
1b320 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
1b330 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
1b340 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
1b350 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
1b360 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
1b370 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
1b380 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
1b390 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
1b3a0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
1b3b0 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
1b3c0 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
1b3d0 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
1b3e0 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
1b3f0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
1b400 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1b410 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
1b420 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
1b430 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
1b440 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
1b450 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
1b460 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
1b470 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
1b480 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
1b490 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
1b4a0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
1b4b0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
1b4c0 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1b4d0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
1b4e0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
1b4f0 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
1b500 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
1b510 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
1b520 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
1b530 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
1b540 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
1b550 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
1b560 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70  .  pListItem = p
1b570 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49  List->a;.  if( I
1b580 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1b590 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  ){.    pIndex->a
1b5a0 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b  ColExpr = pList;
1b5b0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
1b5c0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b5d0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
1b5e0 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
1b5f0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1b600 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  CExpr;          
1b610 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1b620 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73  -th index expres
1b630 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
1b640 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1b650 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53  er;        /* AS
1b660 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65  C or DESC on the
1b670 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e   i-th expression
1b680 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
1b690 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
1b6a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1b6b0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1b6c0 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
1b6d0 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73  3StringToId(pLis
1b6e0 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
1b6f0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1b700 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
1b710 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
1b720 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74  IdxExpr, pListIt
1b730 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  em->pExpr, 0);. 
1b740 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1b750 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
1b760 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b770 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74    pCExpr = sqlit
1b780 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1b790 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  e(pListItem->pEx
1b7a0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45  pr);.    if( pCE
1b7b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1b7c0 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
1b7d0 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1b7e0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  ewTable ){.     
1b7f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b800 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72  sg(pParse, "expr
1b810 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74  essions prohibit
1b820 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45  ed in PRIMARY KE
1b830 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20  Y and ".        
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20          "UNIQUE 
1b860 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
1b870 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1b880 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b8a0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1b8b0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1b8c0 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1b8d0 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
1b8e0 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    pList = 0;.   
1b8f0 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58     }.      j = X
1b900 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1b910 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1b920 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
1b930 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1b940 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1b950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d  }else{.      j =
1b960 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   pCExpr->iColumn
1b970 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b980 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20  j<=0x7fff );.   
1b990 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
1b9a0 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e        j = pTab->
1b9b0 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  iPKey;.      }el
1b9c0 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
1b9d0 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
1b9e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1b9f0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1ba00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ba10 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1ba20 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a  mn[i] = (i16)j;.
1ba30 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20      }.    zColl 
1ba40 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = 0;.    if( pLi
1ba50 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f  stItem->pExpr->o
1ba60 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
1ba70 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c  .      int nColl
1ba80 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
1ba90 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1baa0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1bab0 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
1bac0 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
1bad0 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
1bae0 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
1baf0 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
1bb00 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
1bb10 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
1bb20 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
1bb30 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
1bb40 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
1bb50 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
1bb60 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20   }else if( j>=0 
1bb70 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  ){.      zColl =
1bb80 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1bb90 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
1bba0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f  if( !zColl ) zCo
1bbb0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  ll = sqlite3StrB
1bbc0 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21  INARY;.    if( !
1bbd0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
1bbe0 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
1bbf0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
1bc00 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
1bc10 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1bc20 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1bc30 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1bc40 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
1bc50 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1bc60 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
1bc70 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
1bc80 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
1bc90 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1bca0 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
1bcb0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
1bcc0 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
1bcd0 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f  the table key to
1bce0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1bcf0 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48  index.  For WITH
1bd00 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74  OUT ROWID.  ** t
1bd10 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21  ables (when pPk!
1bd20 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1bd30 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52   the declared PR
1bd40 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a  IMARY KEY.  For.
1bd50 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c    ** normal tabl
1bd60 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29  es (when pPk==0)
1bd70 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
1bd80 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20  e rowid..  */.  
1bd90 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
1bda0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
1bdb0 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
1bdc0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
1bdd0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1bde0 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
1bdf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61   );.      if( ha
1be00 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e  sColumn(pIndex->
1be10 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78  aiColumn, pIndex
1be20 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b  ->nKeyCol, x) ){
1be30 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1be40 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20  >nColumn--; .   
1be50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1be60 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1be70 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20  mn[i] = x;.     
1be80 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1be90 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[i] = pPk->azCo
1bea0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  ll[j];.        p
1beb0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1bec0 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72  r[i] = pPk->aSor
1bed0 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1bee0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
1bef0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1bf00 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  ( i==pIndex->nCo
1bf10 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  lumn );.  }else{
1bf20 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
1bf30 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f  olumn[i] = XN_RO
1bf40 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  WID;.    pIndex-
1bf50 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  >azColl[i] = sql
1bf60 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1bf70 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
1bf80 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
1bf90 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1bfa0 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20  >pNewTable==0 ) 
1bfb0 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
1bfc0 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  th(pIndex);..  /
1bfd0 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1bfe0 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63  contains every c
1bff0 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62  olumn of its tab
1c000 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20  le, then mark.  
1c010 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72  ** it as a cover
1c020 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  ing index */.  a
1c030 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28  ssert( HasRowid(
1c040 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20  pTab) .      || 
1c050 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
1c060 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1c070 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54  Index(pIndex, pT
1c080 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b  ab->iPKey)>=0 );
1c090 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75  .  recomputeColu
1c0a0 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49  mnsNotIndexed(pI
1c0b0 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62  ndex);.  if( pTb
1c0c0 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64  lName!=0 && pInd
1c0d0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61  ex->nColumn>=pTa
1c0e0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70  b->nCol ){.    p
1c0f0 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1c100 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  g = 1;.    for(j
1c110 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1c120 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1c130 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
1c140 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c150 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1c160 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1c170 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69  ex,j)>=0 ) conti
1c180 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  nue;.      pInde
1c190 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1c1a0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1c1b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1c1c0 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
1c1d0 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
1c1e0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1c1f0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
1c200 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
1c210 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
1c220 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
1c230 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
1c240 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1c250 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
1c260 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
1c270 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
1c280 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1c290 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
1c2a0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1c2b0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
1c2c0 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
1c2d0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1c2e0 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
1c2f0 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
1c300 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
1c310 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
1c320 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
1c330 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
1c340 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1c350 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
1c360 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
1c370 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
1c380 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
1c390 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
1c3a0 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
1c3b0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
1c3c0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1c3d0 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
1c3e0 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
1c3f0 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
1c400 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
1c410 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1c420 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20  * Two UNIQUE or 
1c430 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1c440 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73  traints are cons
1c450 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e  idered equivalen
1c460 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68  t.    ** (and th
1c470 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74  us suppressing t
1c480 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65  he second one) e
1c490 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65  ven if they have
1c4a0 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a   different.    *
1c4b0 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20  * sort orders.. 
1c4c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1c4d0 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1c4e0 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
1c4f0 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68  quences or if th
1c500 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  e columns of.   
1c510 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69   ** the constrai
1c520 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66  nt occur in diff
1c530 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68  erent orders, th
1c540 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
1c550 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f  ts are.    ** co
1c560 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63  nsidered distinc
1c570 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c  t and both resul
1c580 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e  t in separate in
1c590 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
1c5a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1c5b0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1c5c0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1c5d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1c5e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
1c5f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1c600 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1c610 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1c620 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65  t( pIdx->idxType
1c630 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1c640 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20  _APPDEF );.     
1c650 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1c660 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
1c670 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
1c680 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64  x->nKeyCol!=pInd
1c690 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  ex->nKeyCol ) co
1c6a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
1c6b0 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
1c6c0 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20  KeyCol; k++){.  
1c6d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1c6e0 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   *z1;.        co
1c6f0 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1c700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1c710 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e  dx->aiColumn[k]>
1c720 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1c730 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1c740 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
1c750 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
1c760 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
1c770 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
1c780 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
1c790 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
1c7a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1c7b0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1c7c0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1c7d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1c7e0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1c7f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1c800 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1c810 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1c820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1c830 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1c840 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1c850 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1c860 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1c870 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1c880 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1c890 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1c8a0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1c8b0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1c8c0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1c8d0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1c8e0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1c8f0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1c900 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1c910 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1c920 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1c930 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1c940 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1c950 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1c960 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1c970 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1c980 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1c990 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1c9a0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1c9b0 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1c9c0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1c9d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1c9e0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1c9f0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1ca00 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1ca10 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1ca20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ca30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ca40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ca50 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1ca60 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1ca70 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1ca80 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1ca90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1caa0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1cab0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1cac0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1cad0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1cae0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1caf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1cb00 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70        if( idxTyp
1cb10 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
1cb20 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70  E_PRIMARYKEY ) p
1cb30 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69  Idx->idxType = i
1cb40 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  dxType;.        
1cb50 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1cb60 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
1cb70 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1cb80 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e  = pParse->pNewIn
1cb90 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  dex;.          p
1cba0 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1cbb0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20   = pIndex;.     
1cbc0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1cbd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cbe0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1cbf0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1cc00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1cc10 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
1cc20 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a  BJECT ){..    /*
1cc30 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
1cc40 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
1cc50 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
1cc60 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20  o the other.    
1cc70 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
1cc80 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
1cc90 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  . .    */.    as
1cca0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1ccb0 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  rr==0 );.    if(
1ccc0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1ccd0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1cce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ccf0 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
1cd00 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
1cd10 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1cd20 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
1cd30 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1cd40 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1cd50 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1cd60 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1cd70 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1cd80 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 69  wTnum;.        i
1cd90 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 48  f( sqlite3IndexH
1cda0 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f 74 50  asDuplicateRootP
1cdb0 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b 0a 20  age(pIndex) ){. 
1cdc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cdd0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cde0 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61   "invalid rootpa
1cdf0 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge");.          
1ce00 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1ce10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ce20 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1ce30 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1ce40 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ex;.        }.  
1ce50 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20      }.      p = 
1ce60 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1ce70 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
1ce80 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
1ce90 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1cea0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a  zName, pIndex);.
1ceb0 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20        if( p ){. 
1cec0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ced0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
1cee0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
1cef0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
1cf00 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
1cf10 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  lt(db);.        
1cf20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1cf30 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1cf40 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61        db->mDbFla
1cf50 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
1cf60 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d  emaChange;.    }
1cf70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1cf80 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1cf90 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1cfa0 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
1cfb0 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1cfc0 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61     ** index is a
1cfd0 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
1cfe0 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
1cff0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1d000 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20  traint) then.   
1d010 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f   ** emit code to
1d020 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   allocate the in
1d030 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20  dex rootpage on 
1d040 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e  disk and make an
1d050 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a   entry for.    *
1d060 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74  * the index in t
1d070 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1d080 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c   table and popul
1d090 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ate the index wi
1d0a0 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  th.    ** conten
1d0b0 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20  t.  But, do not 
1d0c0 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72  do this if we ar
1d0d0 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67  e simply reading
1d0e0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1d0f0 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  er.    ** table 
1d100 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
1d110 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
1d120 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
1d130 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
1d140 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f     ** of a WITHO
1d150 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1d160 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1d170 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1d180 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1d190 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1d1a0 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1d1b0 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f  ARY KEY.    ** o
1d1c0 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
1d1d0 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1d1e0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
1d1f0 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  ce the table.   
1d200 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
1d210 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
1d220 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
1d230 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
1d240 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
1d250 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
1d260 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
1d270 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52     else if( HasR
1d280 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54  owid(pTab) || pT
1d290 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1d2a0 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
1d2b0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1d2c0 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
1d2d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1d2e0 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
1d2f0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1d300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d  );.      if( v==
1d310 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1d320 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1d330 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1d340 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1d350 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
1d360 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
1d370 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
1d380 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
1d390 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75   CreateIndex. Bu
1d3a0 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  t before.      *
1d3b0 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1d3c0 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1d3d0 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1d3e0 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1d3f0 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75      ** Index.tnu
1d400 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  m. This is requi
1d410 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
1d420 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c   index is actual
1d430 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50  ly a .      ** P
1d440 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74  RIMARY KEY and t
1d450 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75  he table is actu
1d460 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52  ally a WITHOUT R
1d470 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a  OWID table. In .
1d480 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61        ** that ca
1d490 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f  se the convertTo
1d4a0 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
1d4b0 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  e() routine will
1d4c0 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a   replace.      *
1d4d0 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20  * the Noop with 
1d4e0 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f  a Goto to jump o
1d4f0 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64  ver the VDBE cod
1d500 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f  e generated belo
1d510 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64  w. */.      pInd
1d520 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1d530 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1d540 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20  OP_Noop);.      
1d550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d560 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74  3(v, OP_CreateBt
1d570 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20  ree, iDb, iMem, 
1d580 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
1d590 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72  .      /* Gather
1d5a0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
1d5b0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
1d5c0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1d5d0 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
1d5e0 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
1d5f0 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
1d600 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1d610 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28         int n = (
1d620 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61  int)(pParse->sLa
1d630 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d  stToken.z - pNam
1d640 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  e->z) + pParse->
1d650 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
1d660 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
1d670 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
1d680 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  --;.        /* A
1d690 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1d6a0 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1d6b0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1d6c0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
1d6d0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1d6e0 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1d6f0 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1d700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  ,.            on
1d710 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
1d720 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
1d730 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20   n, pName->z);. 
1d740 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d750 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
1d760 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
1d770 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
1d780 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
1d790 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
1d7a0 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
1d7b0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
1d7c0 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74  ; */.        zSt
1d7d0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1d7e0 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  .      /* Add an
1d7f0 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1d800 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1d810 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a   index.      */.
1d820 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
1d830 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1d840 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53   .          "INS
1d850 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1d860 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1d870 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1d880 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1d890 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1d8a0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
1d8b0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1d8c0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
1d8d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
1d8e0 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
1d8f0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1d900 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1d910 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d920 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  , zStmt);..     
1d930 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1d940 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1d950 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1d960 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1d970 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20  Expire.      ** 
1d980 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
1d990 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
1d9a0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
1d9b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54   */.      if( pT
1d9c0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1d9d0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1d9e0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1d9f0 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
1da00 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1da10 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1da20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
1da30 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1da40 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65  eSchemaOp(pParse
1da50 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
1da60 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
1da70 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
1da80 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1da90 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
1daa0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e));.        sql
1dab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dac0 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20  , OP_Expire, 0, 
1dad0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
1dae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1daf0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78  mpHere(v, pIndex
1db00 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20  ->tnum);.    }. 
1db10 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
1db20 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
1db30 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
1db40 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
1db50 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
1db60 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
1db70 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
1db80 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
1db90 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
1dba0 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
1dbb0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1dbc0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
1dbd0 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
1dbe0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
1dbf0 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65   (in sqlite3Gene
1dc00 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
1dc10 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20  ecks()) as part 
1dc20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61  of.  ** UPDATE a
1dc30 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  nd INSERT statem
1dc40 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  ents.  .  */.  i
1dc50 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1dc60 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
1dc70 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
1dc80 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
1dc90 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
1dca0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
1dcb0 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
1dcc0 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
1dcd0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1dce0 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
1dcf0 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
1dd00 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1dd10 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
1dd20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
1dd30 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
1dd40 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1dd50 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
1dd60 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
1dd70 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1dd80 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
1dd90 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
1dda0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1ddb0 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1ddc0 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
1ddd0 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
1dde0 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
1ddf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1de00 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  x = 0;.  }.  els
1de10 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f  e if( IN_RENAME_
1de20 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73  OBJECT ){.    as
1de30 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
1de40 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20  ewIndex==0 );.  
1de50 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e    pParse->pNewIn
1de60 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1de70 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1de80 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
1de90 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
1dea0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
1deb0 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
1dec0 65 78 20 29 20 73 71 6c 69 74 65 33 46 72 65 65  ex ) sqlite3Free
1ded0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1dee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1def0 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1df00 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1df10 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1df20 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1df30 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1df40 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1df50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1df60 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, zName);.}../
1df70 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
1df80 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
1df90 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
1dfa0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
1dfb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
1dfc0 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
1dfd0 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
1dfe0 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1dff0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
1e000 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
1e010 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
1e020 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1e030 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1e040 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
1e050 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
1e060 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
1e070 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
1e080 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
1e090 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
1e0a0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
1e0b0 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
1e0c0 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
1e0d0 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
1e0e0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1e0f0 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
1e100 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1e110 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
1e120 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
1e130 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1e140 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  r combination of
1e150 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
1e160 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
1e170 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
1e180 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
1e190 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
1e1a0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
1e1b0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1e1c0 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
1e1d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1e1e0 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
1e1f0 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
1e200 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
1e210 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
1e220 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
1e230 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
1e240 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
1e250 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
1e260 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
1e270 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
1e280 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
1e290 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
1e2a0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
1e2b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1e2c0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
1e2d0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20  ex *pIdx){.  /* 
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1e2f0 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20  0,  9,  8,  7,  
1e300 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56  6 */.  LogEst aV
1e310 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c  al[] = { 33, 32,
1e320 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20   30, 28, 26 };. 
1e330 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64   LogEst *a = pId
1e340 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a  x->aiRowLogEst;.
1e350 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49    int nCopy = MI
1e360 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c  N(ArraySize(aVal
1e370 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  ), pIdx->nKeyCol
1e380 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  );.  int i;..  /
1e390 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64  * Indexes with d
1e3a0 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d  efault row estim
1e3b0 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ates should not 
1e3c0 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20  have stat1 data 
1e3d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49  */.  assert( !pI
1e3e0 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a  dx->hasStat1 );.
1e3f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
1e400 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65  rst entry (numbe
1e410 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1e420 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65   index) to the e
1e430 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e  stimated .  ** n
1e440 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1e450 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68   the table, or h
1e460 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  alf the number o
1e470 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1e480 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70  ble.  ** for a p
1e490 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20  artial index.   
1e4a0 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  But do not let t
1e4b0 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70  he estimate drop
1e4c0 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20   below 10. */.  
1e4d0 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1e4e0 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1e4f0 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61  .  if( pIdx->pPa
1e500 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
1e510 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73  a[0] -= 10;  ass
1e520 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
1e530 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69  LogEst(2) );.  i
1e540 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1e550 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20  ] = 33;         
1e560 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e570 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1e580 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1e590 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1e5a0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1e5b0 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1e5c0 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1e5d0 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1e5e0 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1e5f0 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1e600 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1e610 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1e620 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1e630 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1e640 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1e650 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1e660 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1e680 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1e690 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1e6a0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1e6b0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1e6c0 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1e6d0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1e6e0 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1e6f0 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1e700 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1e710 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1e720 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1e730 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1e740 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1e750 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1e760 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1e770 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1e780 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1e790 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1e7a0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1e7b0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1e7c0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1e7d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1e7e0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1e7f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1e800 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1e810 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1e820 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1e830 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1e840 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1e850 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1e860 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1e870 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1e880 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1e890 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1e8a0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1e8b0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1e8c0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1e8d0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1e8e0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1e8f0 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1e900 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1e910 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1e920 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1e930 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1e940 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1e950 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1e960 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1e970 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1e980 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1e990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1e9a0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1e9b0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1e9c0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1e9d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1e9e0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1e9f0 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1ea00 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ea10 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1ea20 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1ea30 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1ea40 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1ea50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ea60 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1ea70 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1ea80 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1ea90 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1eaa0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1eab0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1eac0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ead0 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1eae0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1eaf0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1eb00 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
1eb10 69 74 65 33 53 63 68 65 6d 61 57 72 69 74 61 62  ite3SchemaWritab
1eb20 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
1eb30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1eb40 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1eb50 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
1eb60 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1eb70 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
1eb80 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
1eb90 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
1eba0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1ebb0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1ebc0 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
1ebd0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
1ebe0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
1ebf0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1ec00 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1ec10 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
1ec20 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
1ec30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1ec40 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1ec50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
1ec60 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1ec70 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
1ec80 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
1ec90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1eca0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1ecb0 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
1ecc0 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
1ecd0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
1ece0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1ecf0 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1ed00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ed10 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ed20 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
1ed30 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
1ed40 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
1ed50 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1ed60 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1ed70 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1ed80 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1ed90 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
1eda0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1edb0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
1edc0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
1edd0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
1ede0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41   WHERE name=%Q A
1edf0 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1ee00 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
1ee10 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1ee20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e  MASTER_NAME, pIn
1ee30 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1ee40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1ee50 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1ee60 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1ee70 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1ee80 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1ee90 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1eea0 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1eeb0 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1eec0 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1eed0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1eee0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1eef0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1ef00 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1ef10 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1ef20 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1ef30 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1ef40 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1ef50 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1ef60 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1ef70 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1ef80 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1ef90 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1efa0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1efb0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1efc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1efd0 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1efe0 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1eff0 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1f000 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1f010 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1f020 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1f030 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1f040 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f050 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1f060 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1f070 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1f080 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1f090 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1f0a0 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1f0b0 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1f0c0 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1f0d0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1f0e0 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1f0f0 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1f100 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1f110 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1f120 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1f130 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1f140 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1f150 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1f160 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1f170 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1f180 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1f190 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f1a0 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1f1b0 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1f1c0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1f1d0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1f1e0 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1f1f0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1f200 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1f210 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1f220 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1f230 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1f240 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1f250 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1f260 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1f270 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1f280 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1f290 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1f2a0 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1f2b0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1f2c0 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1f2d0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1f2e0 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1f2f0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1f300 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1f310 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1f320 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1f330 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1f340 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1f350 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1f360 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1f370 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1f380 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1f390 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1f3a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1f3b0 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1f3c0 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1f3d0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
1f3e0 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20   n = *pnEntry;. 
1f3f0 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29   if( (n & (n-1))
1f400 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ==0 ){.    int s
1f410 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
1f420 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
1f430 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1f440 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
1f450 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
1f460 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1f470 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
1f480 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1f490 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
1f4a0 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
1f4b0 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
1f4c0 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
1f4d0 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
1f4e0 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
1f4f0 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b  y);.  *pIdx = n;
1f500 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
1f510 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1f520 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1f530 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1f540 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
1f550 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1f560 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
1f570 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
1f580 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
1f590 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1f5a0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
1f5b0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
1f5c0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
1f5d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f5e0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1f5f0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1f600 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f610 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
1f620 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1f630 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1f640 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1f650 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1f660 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
1f670 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1f680 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1f690 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
1f6a0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1f6b0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1f6c0 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
1f6d0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1f6e0 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
1f6f0 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
1f700 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
1f710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
1f720 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f730 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1f740 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1f750 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1f760 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f770 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
1f780 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
1f790 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74  _OBJECT && pList
1f7a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
1f7b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
1f7c0 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
1f7d0 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e  , (void*)pList->
1f7e0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b  a[i].zName, pTok
1f7f0 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
1f800 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1f810 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
1f820 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1f830 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1f840 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1f850 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1f860 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1f870 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1f880 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1f890 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1f8a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f8b0 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1f8c0 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
1f8d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f8e0 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
1f8f0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
1f900 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1f910 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1f920 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
1f930 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
1f940 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
1f950 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
1f960 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
1f970 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
1f980 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
1f990 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1f9a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1f9b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1f9c0 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
1f9d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1f9e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1f9f0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
1fa00 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1fa10 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1fa20 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1fa30 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1fa40 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  Maximum size of 
1fa50 61 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  a SrcList object
1fa60 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
1fa70 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20   object is used 
1fa80 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
1fa90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1faa0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
1fab0 65 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65 20 71  ement, and the q
1fac0 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 63 61 6e  uery planner can
1fad0 6e 6f 74 20 64 65 61 6c 20 77 69 74 68 20 6d 6f  not deal with mo
1fae0 72 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20 74 61  re.** than 64 ta
1faf0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20  bles in a join. 
1fb00 20 53 6f 20 61 6e 79 20 76 61 6c 75 65 20 6c 61   So any value la
1fb10 72 67 65 72 20 74 68 61 6e 20 36 34 20 68 65 72  rger than 64 her
1fb20 65 0a 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65  e.** is sufficie
1fb30 6e 74 20 66 6f 72 20 6d 6f 73 74 20 75 73 65 73  nt for most uses
1fb40 2e 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c 75 65  .  Smaller value
1fb50 73 2c 20 6c 69 6b 65 20 73 61 79 20 31 30 2c 20  s, like say 10, 
1fb60 61 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  are.** appropria
1fb70 74 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61 6e 64  te for small and
1fb80 20 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65 64 20   memory-limited 
1fb90 61 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f  applications..*/
1fba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fbb0 4d 41 58 5f 53 52 43 4c 49 53 54 0a 23 20 64 65  MAX_SRCLIST.# de
1fbc0 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
1fbd0 53 52 43 4c 49 53 54 20 32 30 30 0a 23 65 6e 64  SRCLIST 200.#end
1fbe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  if../*.** Expand
1fbf0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
1fc00 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
1fc10 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
1fc20 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
1fc30 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
1fc40 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
1fc50 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
1fc60 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
1fc70 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
1fc80 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
1fc90 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
1fca0 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
1fcb0 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
1fcc0 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
1fcd0 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
1fce0 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
1fcf0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
1fd00 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
1fd10 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1fd20 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
1fd30 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
1fd40 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
1fd50 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
1fd60 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
1fd70 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
1fd80 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
1fd90 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
1fda0 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
1fdb0 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
1fdc0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
1fdd0 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
1fde0 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
1fdf0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
1fe00 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
1fe10 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
1fe20 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
1fe30 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
1fe40 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
1fe50 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
1fe60 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1fe70 6e 20 66 61 69 6c 73 20 6f 72 20 74 68 65 20 53  n fails or the S
1fe80 72 63 4c 69 73 74 20 62 65 63 6f 6d 65 73 20 74  rcList becomes t
1fe90 6f 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76 65 0a  oo large, leave.
1fea0 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
1feb0 53 72 63 4c 69 73 74 20 75 6e 63 68 61 6e 67 65  SrcList unchange
1fec0 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20  d, return NULL, 
1fed0 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
1fee0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
1fef0 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c   pParse..*/.SrcL
1ff00 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1ff10 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 50 61  istEnlarge(.  Pa
1ff20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ff30 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1ff40 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 65  ext into which e
1ff50 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74  rrors are report
1ff60 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ed */.  SrcList 
1ff70 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
1ff80 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
1ff90 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
1ffa0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
1ffb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
1ffc0 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
1ffd0 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
1ffe0 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
1fff0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
20000 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
20010 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
20020 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
20030 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
20040 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
20050 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
20060 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
20070 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
20080 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  a>=1 );.  assert
20090 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61  ( pSrc!=0 );.  a
200a0 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
200b0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20  Src->nSrc );..  
200c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69  /* Allocate addi
200d0 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20  tional space if 
200e0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20  needed */.  if( 
200f0 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b  (u32)pSrc->nSrc+
20100 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
20110 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
20120 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  st *pNew;.    in
20130 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d  t nAlloc = pSrc-
20140 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a  >nSrc*2+nExtra;.
20150 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20160 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
20170 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
20180 63 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49 54 45  c+nExtra>=SQLITE
20190 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a  _MAX_SRCLIST ){.
201a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
201b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
201c0 6f 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61  oo many FROM cla
201d0 75 73 65 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20  use terms, max: 
201e0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
201f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
20200 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a  E_MAX_SRCLIST);.
20210 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
20220 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
20230 6c 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  lloc>SQLITE_MAX_
20240 53 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63  SRCLIST ) nAlloc
20250 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52   = SQLITE_MAX_SR
20260 43 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65 77 20  CLIST;.    pNew 
20270 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
20280 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20  oc(db, pSrc,.   
20290 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
202a0 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c  of(*pSrc) + (nAl
202b0 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53  loc-1)*sizeof(pS
202c0 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  rc->a[0]) );.   
202d0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
202e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
202f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20300 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
20310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
20320 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 53 72   = pNew;.    pSr
20330 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c  c->nAlloc = nAll
20340 6f 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  oc;.  }..  /* Mo
20350 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
20360 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
20370 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
20380 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
20390 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
203a0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
203b0 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
203c0 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
203d0 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
203e0 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
203f0 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
20400 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a   nExtra;..  /* Z
20410 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
20420 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
20430 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
20440 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
20450 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
20460 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
20470 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
20480 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
20490 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
204a0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
204b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
204c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
204d0 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
204e0 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
204f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
20500 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
20510 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
20520 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
20530 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
20540 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
20550 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
20560 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
20570 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
20580 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
20590 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
205a0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
205b0 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
205c0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72   an OOM error or
205d0 20 69 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69   if the.** SrcLi
205e0 73 74 20 67 72 6f 77 73 20 74 6f 20 6c 61 72 67  st grows to larg
205f0 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  e.  The returned
20600 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
20610 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
20620 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
20630 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
20640 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
20650 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
20660 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
20670 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
20680 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
20690 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
206a0 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
206b0 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
206c0 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
206d0 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
206e0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
206f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
20700 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
20710 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
20720 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
20730 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
20740 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
20750 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
20760 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
20770 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
20780 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
20790 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
207a0 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
207b0 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
207c0 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
207d0 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
207e0 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
207f0 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
20800 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
20810 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
20820 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
20830 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
20840 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
20850 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
20860 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
20870 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
20880 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
20890 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
208a0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
208b0 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
208c0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
208d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
208e0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
208f0 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
20900 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
20910 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
20920 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
20930 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
20940 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
20950 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
20960 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
20970 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
20980 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
20990 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
209a0 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
209b0 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
209c0 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
209d0 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
209e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
209f0 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
20a00 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
20a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20a20 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
20a30 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
20a40 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
20a50 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
20a60 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
20a70 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
20a80 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
20a90 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
20aa0 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
20ab0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
20ac0 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  cListAppend(.  P
20ad0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
20ae0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20af0 6e 74 65 78 74 2c 20 69 6e 20 77 68 69 63 68 20  ntext, in which 
20b00 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72  errors are repor
20b10 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ted */.  SrcList
20b20 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
20b30 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53  Append to this S
20b40 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65  rcList. NULL cre
20b50 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69  ates a new SrcLi
20b60 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
20b70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
20b80 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a  able to append *
20b90 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
20ba0 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62  base    /* Datab
20bb0 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ase of the table
20bc0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
20bd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
20be0 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
20bf0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  db;.  assert( pD
20c00 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
20c10 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
20c20 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
20c30 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65  hout B */.  asse
20c40 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
20c50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20c60 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64 62  e->db!=0 );.  db
20c70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20c80 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
20c90 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
20ca0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
20cb0 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
20cc0 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
20cd0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
20ce0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20cf0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
20d00 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 1;.    pList->
20d10 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65  nSrc = 1;.    me
20d20 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30  mset(&pList->a[0
20d30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
20d40 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
20d50 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  pList->a[0].iCur
20d60 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  sor = -1;.  }els
20d70 65 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  e{.    SrcList *
20d80 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 72  pNew = sqlite3Sr
20d90 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61  cListEnlarge(pPa
20da0 72 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70  rse, pList, 1, p
20db0 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20  List->nSrc);.   
20dc0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
20de0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
20df0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
20e00 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
20e10 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
20e20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pNew;.    }.  }.
20e30 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
20e40 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
20e50 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
20e60 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
20e70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
20e80 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
20e90 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
20ea0 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
20eb0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
20ec0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
20ed0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  pDatabase);.    
20ee0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
20ef0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
20f00 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
20f10 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
20f20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
20f30 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
20f40 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
20f50 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
20f60 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
20f70 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
20f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
20f90 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
20fa0 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
20fb0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
20fc0 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
20fd0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
20fe0 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
20ff0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
21000 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
21010 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
21020 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
21030 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
21040 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
21050 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
21060 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
21070 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
21080 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
21090 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
210a0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
210b0 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
210c0 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
210d0 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
210e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
210f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
21100 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
21110 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
21120 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
21130 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
21140 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
21150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21160 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
21170 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
21180 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
21190 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
211a0 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
211b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
211c0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
211d0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
211e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
211f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21200 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
21210 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
21220 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
21230 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
21240 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
21250 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
21260 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21270 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
21280 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
21290 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
212a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
212b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
212c0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
212d0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
212e0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
212f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21300 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
21310 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
21320 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
21330 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
21340 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
21350 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
21360 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
21370 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
21380 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
21390 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
213a0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
213b0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
213c0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
213d0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
213e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
213f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
21400 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
21410 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
21420 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
21430 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
21440 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
21450 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
21460 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
21470 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
21480 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
21490 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
214a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
214b0 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
214c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
214d0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
214e0 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
214f0 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
21500 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
21510 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
21520 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
21530 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
21540 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
21550 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
21560 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
21570 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
21580 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
21590 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
215a0 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
215b0 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
215c0 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
215d0 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
215e0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
215f0 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
21600 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
21610 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
21620 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
21630 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
21640 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
21650 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
21660 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
21670 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
21680 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
21690 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
216a0 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
216b0 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
216c0 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
216d0 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
216e0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
216f0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
21700 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
21710 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
21720 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
21730 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
21740 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
21750 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
21760 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
21770 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
21780 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
21790 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
217a0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
217b0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
217c0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
217d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
217e0 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
217f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21800 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
21810 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
21820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21830 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
21840 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
21850 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
21860 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
21870 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
21880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
21890 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
218a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
218b0 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
218c0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
218d0 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
218e0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
218f0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
21900 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
21910 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
21920 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
21930 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
21940 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
21950 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
21960 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
21970 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
21980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21990 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
219a0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
219b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
219c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
219d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
219e0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
219f0 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
21a00 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
21a10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21a20 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
21a30 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
21a40 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
21a50 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
21a60 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
21a70 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
21a80 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
21a90 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
21aa0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
21ab0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
21ac0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
21ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
21ae0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
21af0 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
21b00 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
21b10 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
21b20 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65  >nSrc-1];.  asse
21b30 72 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d  rt( (pTable==0)=
21b40 3d 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20  =(pDatabase==0) 
21b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
21b60 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20  em->zName==0 || 
21b70 70 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a  pDatabase!=0 );.
21b80 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
21b90 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d  OBJECT && pItem-
21ba0 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f  >zName ){.    To
21bb0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41  ken *pToken = (A
21bc0 4c 57 41 59 53 28 70 44 61 74 61 62 61 73 65 29  LWAYS(pDatabase)
21bd0 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
21be0 29 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20  ) ? pDatabase : 
21bf0 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  pTable;.    sqli
21c00 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
21c10 70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  p(pParse, pItem-
21c20 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  >zName, pToken);
21c30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
21c40 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
21c50 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
21c60 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
21c70 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21c80 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
21c90 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
21ca0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
21cb0 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
21cc0 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
21cd0 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
21ce0 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
21cf0 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
21d00 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
21d10 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
21d20 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
21d30 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
21d40 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
21d50 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
21d60 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
21d70 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
21d80 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21d90 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
21da0 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
21db0 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
21dc0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
21dd0 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
21de0 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
21df0 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
21e00 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
21e10 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
21e20 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
21e30 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
21e40 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
21e50 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
21e60 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
21e70 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
21e80 20 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78   if( p && pIndex
21e90 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  edBy->n>0 ){.   
21ea0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21eb0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
21ec0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63   assert( p->nSrc
21ed0 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
21ee0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
21ef0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
21f00 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
21f10 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
21f20 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
21f30 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
21f40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21f50 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
21f60 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nc==0 );.    if(
21f70 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
21f80 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
21f90 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
21fa0 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
21fb0 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
21fc0 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
21fd0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
21fe0 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
21ff0 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
22000 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
22010 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  fg.notIndexed = 
22020 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22030 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49      pItem->u1.zI
22040 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
22050 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
22060 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
22070 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70  exedBy);.      p
22080 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
22090 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  edBy = 1;.    }.
220a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
220b0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
220c0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
220d0 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
220e0 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
220f0 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
22100 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
22110 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
22120 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
22130 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
22140 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
22150 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
22160 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22170 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
22180 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
22190 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
221a0 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
221b0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
221c0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
221d0 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
221e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
221f0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
22200 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   );.    pItem->u
22210 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69  1.pFuncArg = pLi
22220 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66  st;.    pItem->f
22230 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b  g.isTabFunc = 1;
22240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
22250 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
22260 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
22270 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pList);.  }.}../
22280 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
22290 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
222a0 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
222b0 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
222c0 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
222d0 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
222e0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
222f0 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
22300 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
22310 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
22320 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
22330 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
22340 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
22350 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
22360 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
22370 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
22380 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
22390 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
223a0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
223b0 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
223c0 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
223d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
223e0 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
223f0 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
22400 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
22410 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
22420 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
22430 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
22440 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
22450 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
22460 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
22470 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
22480 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
22490 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
224a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
224b0 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
224c0 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
224d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
224e0 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
224f0 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
22500 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
22510 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
22520 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
22530 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
22540 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  i].fg.jointype =
22550 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f   p->a[i-1].fg.jo
22560 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
22570 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69    p->a[0].fg.joi
22580 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
22590 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
225a0 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
225b0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
225c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
225d0 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
225e0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
225f0 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
22600 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
22610 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
22620 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22630 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
22640 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
22650 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
22660 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
22670 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
22680 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
22690 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
226a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
226b0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
226c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
226d0 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
226e0 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
226f0 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
22700 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
22710 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
22720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22730 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
22740 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
22750 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
22760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22770 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
22780 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
22790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
227a0 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p0(v, OP_AutoCom
227b0 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  mit);.}../*.** G
227c0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
227d0 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f  e for a COMMIT o
227e0 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65  r ROLLBACK state
227f0 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f  ment..** Code fo
22800 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65  r ROLLBACK is ge
22810 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65  nerated if eType
22820 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20  ==TK_ROLLBACK.  
22830 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64  Otherwise.** cod
22840 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
22850 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a  or a COMMIT..*/.
22860 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
22870 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
22880 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54   *pParse, int eT
22890 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ype){.  Vdbe *v;
228a0 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63  .  int isRollbac
228b0 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  k;..  assert( pP
228c0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
228d0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
228e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
228f0 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54  eType==TK_COMMIT
22900 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e   || eType==TK_EN
22910 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  D || eType==TK_R
22920 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52  OLLBACK );.  isR
22930 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d  ollback = eType=
22940 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  =TK_ROLLBACK;.  
22950 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
22960 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
22970 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
22980 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62   .       isRollb
22990 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22  ack ? "ROLLBACK"
229a0 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20   : "COMMIT", 0, 
229b0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
229c0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
229d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
229e0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
229f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22a00 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
22a10 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c  ommit, 1, isRoll
22a20 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  back);.  }.}../*
22a30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22a40 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
22a50 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
22a60 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
22a70 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
22a80 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
22a90 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
22aa0 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
22ab0 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
22ac0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22ad0 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
22ae0 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
22af0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
22b00 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
22b10 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
22b20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
22b30 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
22b40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
22b50 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
22b60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
22b70 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
22b80 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
22b90 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
22ba0 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
22bb0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
22bc0 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
22bd0 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
22be0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
22bf0 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
22c00 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
22c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
22c20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
22c30 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
22c40 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
22c50 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
22c60 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
22c70 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
22c80 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
22c90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
22ca0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
22cb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
22cc0 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
22cd0 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
22ce0 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
22cf0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
22d00 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
22d10 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
22d20 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
22d30 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
22d40 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
22d50 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
22d60 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
22d70 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
22d80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
22d90 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
22da0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
22db0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22dc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22dd0 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
22de0 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
22df0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
22e00 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
22e10 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
22e20 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
22e30 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
22e40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22e50 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
22e60 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
22e70 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
22e80 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
22e90 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
22ea0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22eb0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
22ec0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22ed0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
22ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22ef0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
22f00 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
22f10 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
22f20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22f30 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
22f40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22f50 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
22f60 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
22f70 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
22f80 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
22f90 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
22fa0 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
22fb0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
22fc0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22fd0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
22fe0 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
22ff0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
23000 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
23010 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
23020 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
23030 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
23040 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
23050 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
23060 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
23070 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
23080 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23090 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
230a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
230b0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
230c0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
230d0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
230e0 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
230f0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
23100 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
23110 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
23120 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
23130 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
23140 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
23150 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
23160 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
23170 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
23180 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
23190 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
231a0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
231b0 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
231c0 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
231d0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
231e0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
231f0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
23200 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  );..  assert( iD
23210 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
23220 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
23230 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
23240 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  >db->aDb[iDb].pB
23250 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
23260 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
23270 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
23280 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  HED+2 );.  asser
23290 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
232a0 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65  MutexHeld(pParse
232b0 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  ->db, iDb, 0) );
232c0 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73  .  if( DbMaskTes
232d0 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
232e0 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
232f0 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
23300 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
23310 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  kieMask, iDb);. 
23320 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
23330 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
23340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
23350 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
23360 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  Toplevel);.    }
23370 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
23380 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73   argument zDb is
23390 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c   NULL, then call
233a0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
233b0 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65  fySchema() for e
233c0 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  ach .** attached
233d0 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72   database. Other
233e0 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20  wise, invoke it 
233f0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
23400 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e   named zDb only.
23410 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23420 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
23430 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
23440 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
23450 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  *zDb){.  sqlite3
23460 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23470 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  b;.  int i;.  fo
23480 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
23490 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
234a0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
234b0 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
234c0 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20  pBt && (!zDb || 
234d0 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
234e0 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53  p(zDb, pDb->zDbS
234f0 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
23500 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
23510 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
23520 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
23530 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23540 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
23550 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
23560 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
23570 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
23580 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
23590 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
235a0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
235b0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
235c0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
235d0 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
235e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
235f0 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
23600 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
23610 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
23620 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
23630 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
23640 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
23650 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
23660 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
23670 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
23680 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
23690 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
236a0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
236b0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
236c0 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
236d0 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
236e0 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
236f0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
23700 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
23710 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
23720 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
23730 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
23740 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
23750 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
23760 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
23770 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
23780 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
23790 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
237a0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
237b0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
237c0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
237d0 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
237e0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
237f0 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
23800 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
23810 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
23820 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
23830 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
23840 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23850 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
23860 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
23870 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
23880 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54  ;.  DbMaskSet(pT
23890 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61  oplevel->writeMa
238a0 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70  sk, iDb);.  pTop
238b0 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
238c0 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
238d0 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
238e0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
238f0 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
23900 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
23910 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
23920 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
23930 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
23940 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
23950 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
23960 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
23970 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
23980 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
23990 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
239a0 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
239b0 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
239c0 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
239d0 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
239e0 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
239f0 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
23a00 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
23a10 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
23a20 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
23a30 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
23a40 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
23a50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
23a60 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
23a70 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
23a80 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
23a90 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
23aa0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
23ab0 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
23ac0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
23ad0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
23ae0 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
23af0 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
23b00 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
23b10 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
23b20 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
23b30 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
23b40 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
23b50 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
23b60 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
23b70 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
23b80 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
23b90 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
23ba0 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
23bb0 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
23bc0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23bd0 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
23be0 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
23bf0 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
23c00 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
23c10 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
23c20 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
23c30 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
23c40 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
23c50 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
23c60 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
23c70 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
23c80 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
23c90 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
23ca0 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
23cb0 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
23cc0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
23cd0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
23ce0 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
23cf0 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
23d00 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
23d10 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
23d20 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
23d30 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
23d40 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
23d50 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
23d60 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
23d70 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
23d80 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
23d90 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
23da0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
23db0 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
23dc0 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
23dd0 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
23de0 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
23df0 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
23e00 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
23e10 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
23e20 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
23e30 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
23e40 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
23e50 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
23e60 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
23e70 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
23e80 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
23e90 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
23ea0 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
23eb0 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
23ec0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
23ed0 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
23ee0 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
23ef0 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
23f00 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
23f10 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
23f20 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
23f30 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
23f40 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
23f50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23f60 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
23f70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
23f80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23f90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
23fa0 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
23fb0 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
23fc0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
23fd0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
23fe0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
23ff0 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
24000 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
24010 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70  essage */.  i8 p
24020 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a  4type,        /*
24030 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
24040 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20  _TRANSIENT */.  
24050 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20  u8 p5Errmsg     
24060 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74    /* P5_ErrMsg t
24070 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ype */.){.  Vdbe
24080 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
24090 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
240a0 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65  assert( (errCode
240b0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
240c0 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69  ONSTRAINT );.  i
240d0 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
240e0 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
240f0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
24100 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
24110 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
24120 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65  OP_Halt, errCode
24130 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34  , onError, 0, p4
24140 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c  , p4type);.  sql
24150 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
24160 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d  (v, p5Errmsg);.}
24170 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
24180 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55  OP_Halt due to U
24190 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
241a0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
241b0 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  violation..*/.vo
241c0 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65  id sqlite3Unique
241d0 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
241e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
241f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24200 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
24210 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
24220 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
24230 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
24240 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
24250 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74   that triggers t
24260 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  he constraint */
24270 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
24280 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72  ;.  int j;.  Str
24290 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20  Accum errMsg;.  
242a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
242b0 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73  dx->pTable;..  s
242c0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
242d0 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72  it(&errMsg, pPar
242e0 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30  se->db, 0, 0, 20
242f0 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  0);.  if( pIdx->
24300 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20  aColExpr ){.    
24310 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
24320 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ndf(&errMsg, "in
24330 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
24340 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
24350 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
24360 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
24370 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
24380 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
24390 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
243a0 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
243b0 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
243c0 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
243d0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
243e0 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
243f0 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
24400 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
24410 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
24420 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
24430 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a  &errMsg, pTab->z
24440 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
24450 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
24460 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29  &errMsg, ".", 1)
24470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24480 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65  str_appendall(&e
24490 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
244a0 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d    }.  }.  zErr =
244b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
244c0 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
244d0 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
244e0 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
244f0 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b   .    IsPrimaryK
24500 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20  eyIndex(pIdx) ? 
24510 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
24520 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20  T_PRIMARYKEY .  
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49            : SQLI
24550 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
24560 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f  IQUE,.    onErro
24570 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  r, zErr, P4_DYNA
24580 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69  MIC, P5_Constrai
24590 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f  ntUnique);.}.../
245a0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
245b0 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d  Halt due to non-
245c0 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f  unique rowid..*/
245d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77  .void sqlite3Row
245e0 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  idConstraint(.  
245f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24600 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24610 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
24620 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
24630 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
24640 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  on algorithm */.
24650 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
24660 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
24670 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e   with the non-un
24680 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29  ique rowid */ .)
24690 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
246a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
246b0 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
246c0 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
246d0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
246e0 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c  se->db, "%s.%s",
246f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
24720 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
24730 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
24740 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
24750 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  NT_PRIMARYKEY;. 
24760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67   }else{.    zMsg
24770 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
24780 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
24790 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e  s.rowid", pTab->
247a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
247b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
247c0 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
247d0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
247e0 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63  raint(pParse, rc
247f0 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c  , onError, zMsg,
24800 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20   P4_DYNAMIC,.   
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69       P5_Constrai
24830 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a  ntUnique);.}../*
24840 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
24850 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
24860 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
24870 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
24880 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
24890 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
248a0 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
248b0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
248c0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
248d0 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
248e0 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
248f0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
24900 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
24910 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
24920 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
24930 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
24940 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
24950 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
24960 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
24970 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73  Coll[i];.    ass
24980 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e  ert( z!=0 || pIn
24990 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
249a0 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  <0 );.    if( pI
249b0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
249c0 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  ]>=0 && 0==sqlit
249d0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
249e0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
249f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
24a00 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
24a10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
24a20 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
24a30 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
24a40 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
24a50 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
24a60 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
24a70 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
24a80 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
24a90 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
24aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
24ab0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
24ac0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
24ad0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
24ae0 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
24af0 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69  nst *zColl){.  i
24b00 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
24b10 61 62 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ab) ){.    Index
24b20 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
24b30 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
24b40 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
24b50 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20  th pTab */..    
24b60 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
24b70 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
24b80 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
24b90 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
24ba0 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
24bb0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
24bc0 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
24bd0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
24be0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
24bf0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
24c00 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
24c10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24c20 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
24c30 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
24c40 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
24c50 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
24c60 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
24c70 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
24c80 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
24c90 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
24ca0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
24cb0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
24cc0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
24cd0 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
24ce0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
24cf0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
24d00 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
24d10 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
24d20 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
24d30 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
24d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24d50 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
24d60 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
24d70 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
24d80 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
24d90 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
24da0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
24db0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
24dc0 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
24dd0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24df0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
24e00 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
24e10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24e20 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
24e30 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
24e40 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
24e50 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
24e60 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
24e70 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
24e80 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
24e90 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
24ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
24eb0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
24ec0 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  abase */..  asse
24ed0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
24ee0 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
24ef0 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65  db) );  /* Neede
24f00 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
24f10 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62  ess */.  for(iDb
24f20 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
24f30 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
24f40 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
24f50 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
24f60 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
24f70 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
24f80 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
24f90 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
24fa0 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
24fb0 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
24fc0 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
24fd0 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
24fe0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
24ff0 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
25000 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
25010 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
25020 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
25030 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
25040 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
25050 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25070 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
25080 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
25090 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
250a0 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
250b0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
250c0 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
250d0 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
250e0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
250f0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
25100 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
25110 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
25120 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
25130 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
25140 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
25150 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
25160 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
25170 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
25180 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
25190 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
251a0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
251b0 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
251c0 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
251d0 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
251e0 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
251f0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
25200 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
25210 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25220 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
25230 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
25240 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
25250 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
25260 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
25270 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
25280 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
25290 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
252a0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
252b0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
252c0 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
252d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
252e0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
252f0 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
25300 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
25310 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
25320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
25330 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25350 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
25360 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
25370 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
25380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
25390 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
253a0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
253b0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
253d0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
253e0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
253f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
25400 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
25410 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
25420 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
25430 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
25440 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
25450 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
25460 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
25470 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
25480 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
25490 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
254a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
254b0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
254c0 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
254d0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
254e0 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
254f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
25500 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
25510 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
25520 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
25530 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
25540 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
25550 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
25560 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
25570 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
25580 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
25590 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
255a0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
255b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
255c0 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
255d0 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
255e0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
255f0 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
25600 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
25610 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
25620 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
25630 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
25640 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
25650 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
25660 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
25670 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
25680 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
25690 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
256a0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
256b0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
256c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
256d0 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
256e0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
256f0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
25700 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
25710 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
25720 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
25730 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
25740 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
25750 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
25760 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
25770 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
25780 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
25790 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
257a0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
257b0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
257c0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
257d0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
257e0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
257f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
25800 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
25810 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
25820 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
25830 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
25840 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
25850 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
25860 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
25870 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
25880 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
25890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
258a0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
258b0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
258c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
258d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
258e0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
258f0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
25900 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
25910 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
25920 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
25930 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
25940 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70  ture that is app
25950 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
25960 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a   given Index..**
25970 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
25980 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
25990 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
259a0 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
259b0 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65  ed object.** whe
259c0 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65  n it has finishe
259d0 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b  d using it..*/.K
259e0 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
259f0 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61  eyInfoOfIndex(Pa
25a00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
25a10 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
25a20 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
25a30 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
25a40 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64    int nKey = pId
25a50 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65  x->nKeyCol;.  Ke
25a60 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69  yInfo *pKey;.  i
25a70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
25a80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
25a90 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  ( pIdx->uniqNotN
25aa0 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20  ull ){.    pKey 
25ab0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
25ac0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
25ad0 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65  , nKey, nCol-nKe
25ae0 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
25af0 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
25b00 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
25b10 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29  se->db, nCol, 0)
25b20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79  ;.  }.  if( pKey
25b30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25b40 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
25b50 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
25b60 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
25b70 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
25b80 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
25b90 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
25ba0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Coll[i];.      p
25bb0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
25bc0 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74  zColl==sqlite3St
25bd0 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20  rBINARY ? 0 :.  
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
25c00 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
25c10 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
25c20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
25c30 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  r[i] = pIdx->aSo
25c40 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
25c50 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
25c60 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
25c70 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
25c80 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
25c90 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51  _MISSING_COLLSEQ
25ca0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
25cb0 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20  dx->bNoQuery==0 
25cc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ){.        /* De
25cd0 61 63 74 69 76 61 74 65 20 74 68 65 20 69 6e 64  activate the ind
25ce0 65 78 20 62 65 63 61 75 73 65 20 69 74 20 63 6f  ex because it co
25cf0 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77  ntains an unknow
25d00 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20  n collating.    
25d10 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e      ** sequence.
25d20 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74    The only way t
25d30 6f 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69  o reactive the i
25d40 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f 61  ndex is to reloa
25d50 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
25d60 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e 67   schema.  Adding
25d70 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c   the missing col
25d80 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
25d90 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20  later does not. 
25da0 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74 69         ** reacti
25db0 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54  ve the index.  T
25dc0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68  he application h
25dd0 61 64 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  ad the chance to
25de0 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 20 20   register.      
25df0 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e 67    ** the missing
25e00 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65   index using the
25e10 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65   collation-neede
25e20 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72  d callback.  For
25e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70  .        ** simp
25e40 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20 77  licity, SQLite w
25e50 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65  ill not give the
25e60 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20 73   application a s
25e70 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20  econd chance..  
25e80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25e90 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20   pIdx->bNoQuery 
25ea0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
25eb0 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
25ec0 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20  _ERROR_RETRY;.  
25ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
25ee0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
25ef0 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65  pKey);.      pKe
25f00 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 0;.    }.  }
25f10 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
25f20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
25f30 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a  E_OMIT_CTE./* .*
25f40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25f50 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70  s invoked once p
25f60 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61  er CTE by the pa
25f70 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69  rser while parsi
25f80 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c  ng a .** WITH cl
25f90 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a  ause. .*/.With *
25fa0 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a  sqlite3WithAdd(.
25fb0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
25fd0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
25fe0 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
25ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69            /* Exi
26000 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73  sting WITH claus
26010 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
26020 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
26030 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
26040 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61  of the common-ta
26050 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
26060 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20  t *pArglist,    
26070 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c   /* Optional col
26080 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f  umn name list fo
26090 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
260a0 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20   Select *pQuery 
260b0 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
260c0 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  y used to initia
260d0 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a  lize the table *
260e0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
260f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26100 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20  .  With *pNew;. 
26110 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20   char *zName;.. 
26120 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
26130 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75  he CTE name is u
26140 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69  nique within thi
26150 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49  s WITH clause. I
26160 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72  f.  ** not, stor
26170 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  e an error in th
26180 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
26190 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  e. */.  zName = 
261a0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
261b0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
261c0 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
261d0 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b  Name && pWith ){
261e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
261f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68  for(i=0; i<pWith
26200 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
26210 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
26220 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57  trICmp(zName, pW
26230 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ith->a[i].zName)
26240 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
26250 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
26260 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
26270 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d  e WITH table nam
26280 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
26290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
262a0 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  }..  if( pWith )
262b0 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
262c0 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  = sizeof(*pWith)
262d0 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68   + (sizeof(pWith
262e0 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d  ->a[1]) * pWith-
262f0 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77  >nCte);.    pNew
26300 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
26310 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e  loc(db, pWith, n
26320 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
26330 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
26340 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
26350 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68  b, sizeof(*pWith
26360 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
26370 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e  ( (pNew!=0 && zN
26380 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  ame!=0) || db->m
26390 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
263a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
263b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
263c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
263d0 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74  ete(db, pArglist
263e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
263f0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
26400 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
26410 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
26420 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  ame);.    pNew =
26430 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b   pWith;.  }else{
26440 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
26450 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74  w->nCte].pSelect
26460 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70   = pQuery;.    p
26470 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
26480 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c  e].pCols = pArgl
26490 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ist;.    pNew->a
264a0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61  [pNew->nCte].zNa
264b0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
264c0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
264d0 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b  te].zCteErr = 0;
264e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b  .    pNew->nCte+
264f0 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  +;.  }..  return
26500 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
26510 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  Free the content
26520 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62  s of the With ob
26530 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
26540 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
26550 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
26560 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71  te3WithDelete(sq
26570 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
26580 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70  *pWith){.  if( p
26590 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
265a0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
265b0 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
265c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
265d0 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70  t Cte *pCte = &p
265e0 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  With->a[i];.    
265f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
26600 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
26610 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  ->pCols);.      
26620 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
26630 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  ete(db, pCte->pS
26640 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
26650 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
26660 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
26670 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
26680 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29  bFree(db, pWith)
26690 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
266a0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
266b0 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a     E_OMIT_CTE) */.