/ Hex Artifact Content
Login

Artifact 9ee9a6d4dc5e8cddd0657fc9f2208849e83a59b9cd862bd828260ff28dd972a6:


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 54 61 62 6c 65 20 2a 70 45 70        Table *pEp
34d0: 6f 54 61 62 20 3d 20 70 4d 6f 64 2d 3e 70 45 70  oTab = pMod->pEp
34e0: 6f 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  oTab;.          
34f0: 61 73 73 65 72 74 28 20 49 73 52 65 75 73 65 53  assert( IsReuseS
3500: 63 68 65 6d 61 28 64 62 29 20 7c 7c 20 70 45 70  chema(db) || pEp
3510: 6f 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  oTab->pSchema==d
3520: 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
3530: 61 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  a );.          p
3540: 45 70 6f 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  EpoTab->pSchema 
3550: 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63  = db->aDb[0].pSc
3560: 68 65 6d 61 3b 20 20 2f 2a 20 46 6f 72 20 53 48  hema;  /* For SH
3570: 41 52 45 44 5f 53 43 48 45 4d 41 20 6d 6f 64 65  ARED_SCHEMA mode
3580: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
3590: 74 75 72 6e 20 70 45 70 6f 54 61 62 3b 0a 20 20  turn pEpoTab;.  
35a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
35c0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c 4f 43   if( flags & LOC
35d0: 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65 74 75  ATE_NOERR ) retu
35e0: 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65  rn 0;.    pParse
35f0: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
3600: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  1;.  }else if( I
3610: 73 56 69 72 74 75 61 6c 28 70 29 20 26 26 20 70  sVirtual(p) && p
3620: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74  Parse->disableVt
3630: 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b  ab ){.    p = 0;
3640: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d 30  .  }..  if( p==0
3650: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
3660: 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67 73  ar *zMsg = flags
3670: 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 3f   & LOCATE_VIEW ?
3680: 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20   "no such view" 
3690: 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  : "no such table
36a0: 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  ";.    if( zDbas
36b0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
36c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
36d0: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20  e, "%s: %s.%s", 
36e0: 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  zMsg, zDbase, zN
36f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
3700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3710: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3720: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
3730: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
3740: 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ..  return p;.}.
3750: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
3760: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
3770: 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20  ed by *p..**.** 
3780: 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65  This is a wrappe
3790: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
37a0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54  LocateTable(). T
37b0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
37c0: 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  tween.** sqlite3
37d0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e  LocateTable() an
37e0: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
37f0: 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
3800: 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a  ction restricts.
3810: 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  ** the search to
3820: 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68   schema (p->pSch
3830: 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f  ema) if it is no
3840: 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65  t NULL. p->pSche
3850: 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e  ma may be.** non
3860: 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70  -NULL if it is p
3870: 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72  art of a view or
3880: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
3890: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65   definition. See
38a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72  .** sqlite3FixSr
38b0: 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61  cList() for deta
38c0: 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ils..*/.Table *s
38d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
38e0: 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a  eItem(.  Parse *
38f0: 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20 66  pParse, .  u32 f
3900: 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20 53  lags,.  struct S
3910: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3920: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3930: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3940: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3950: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3960: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3970: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3980: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3990: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
39a0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
39b0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
39c0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
39d0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d 65  ].zDbSName;.  }e
39e0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
39f0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
3a00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3a10: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
3a20: 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a  rse, flags, p->z
3a30: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f  Name, zDb);.}../
3a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
3a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
3a70: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
3a80: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
3a90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
3aa0: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
3ab0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
3ac0: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
3ad0: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
3ae0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
3af0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
3b00: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
3b10: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
3b20: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
3b30: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
3b40: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
3b50: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
3b60: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
3b70: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
3b80: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
3b90: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
3ba0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
3bb0: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
3bc0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
3bd0: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
3be0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
3bf0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
3c00: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
3c10: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
3c20: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
3c30: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
3c40: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
3c50: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
3c60: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
3c70: 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d  nt i;.  /* All m
3c80: 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69  utexes are requi
3c90: 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  red for schema a
3ca0: 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72  ccess.  Make sur
3cb0: 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20  e we hold them. 
3cc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62  */.  assert( zDb
3cd0: 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  !=0 || sqlite3Bt
3ce0: 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
3cf0: 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28  es(db) );.  for(
3d00: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
3d10: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3d20: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
3d30: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
3d40: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
3d50: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
3d60: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
3d70: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  = db->aDb[j].pSc
3d80: 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
3d90: 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ( pSchema );.   
3da0: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
3db0: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
3dc0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e  db->aDb[j].zDbSN
3dd0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
3de0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
3df0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
3e00: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
3e10: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
3e20: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
3e30: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
3e40: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  e);.    if( p ) 
3e50: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
3e60: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3e70: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
3e80: 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  ry used by an in
3e90: 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dex.*/.void sqli
3ea0: 74 65 33 46 72 65 65 49 6e 64 65 78 28 73 71 6c  te3FreeIndex(sql
3eb0: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
3ec0: 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  *p){.#ifndef SQL
3ed0: 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
3ee0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
3ef0: 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c  IndexSamples(db,
3f00: 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71   p);.#endif.  sq
3f10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3f20: 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57  db, p->pPartIdxW
3f30: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  here);.  sqlite3
3f40: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
3f50: 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b  b, p->aColExpr);
3f60: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3f70: 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29  (db, p->zColAff)
3f80: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73  ;.  if( p->isRes
3f90: 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44 62  ized ) sqlite3Db
3fa0: 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a  Free(db, (void *
3fb0: 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66  )p->azColl);.#if
3fc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3fd0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
3fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3ff0: 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65  p->aiRowEst);.#e
4000: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
4010: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
4020: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e  /*.** For the in
4030: 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e  dex called zIdxN
4040: 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75  ame which is fou
4050: 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nd in the databa
4060: 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b  se iDb,.** unlik
4070: 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f  e that index fro
4080: 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e  m its Table then
4090: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
40a0: 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e  x from.** the in
40b0: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61  dex hash table a
40c0: 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  nd free all memo
40d0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ry structures as
40e0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
40f0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76   the index..*/.v
4100: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
4110: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
4120: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4130: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
4140: 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49   *zIdxName){.  I
4150: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
4160: 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20  Hash *pHash;..  
4170: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4180: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4190: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
41a0: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62  pHash = &db->aDb
41b0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
41c0: 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78  dxHash;.  pIndex
41d0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
41e0: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78  sert(pHash, zIdx
41f0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
4200: 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20 29  ALWAYS(pIndex) )
4210: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
4220: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
4230: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
4240: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
4250: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
4260: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
4270: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
4280: 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75   *p;.      /* Ju
4290: 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41  stification of A
42a0: 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e  LWAYS();  The in
42b0: 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74  dex must be on t
42c0: 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20  he list of.     
42d0: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a   ** indices. */.
42e0: 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78        p = pIndex
42f0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
4300: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
4310: 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70  LWAYS(p) && p->p
4320: 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20  Next!=pIndex ){ 
4330: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a  p = p->pNext; }.
4340: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
4350: 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d  (p && p->pNext==
4360: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
4370: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
4380: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4390: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
43a0: 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28  qlite3FreeIndex(
43b0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
43c0: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
43d0: 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
43e0: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
43f0: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
4400: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
4410: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
4420: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
4430: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
4440: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
4450: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
4460: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
4470: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
4480: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
4490: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
44a0: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
44b0: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
44c0: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
44d0: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
44e0: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
44f0: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
4500: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
4510: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
4520: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
4530: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
4540: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
4550: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
4560: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
4570: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4580: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4590: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
45a0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
45b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
45c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
45d0: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
45e0: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
45f0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
4600: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4610: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
4620: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
4630: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
4640: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
4650: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
4660: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
4670: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
4680: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
4690: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
46a0: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
46b0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
46c0: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
46d0: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
46e0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
46f0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
4700: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4710: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
4720: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
4730: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
4740: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
4750: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20  * TEMP schema.  
4760: 54 68 65 20 72 65 73 65 74 20 69 73 20 64 65 66  The reset is def
4770: 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e 53 63  erred if db->nSc
4780: 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74 20  hemaLock is not 
4790: 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72 65  zero..** Deferre
47a0: 64 20 72 65 73 65 74 73 20 6d 61 79 20 62 65 20  d resets may be 
47b0: 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  run by calling w
47c0: 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f  ith iDb<0..*/.vo
47d0: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
47e0: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
47f0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4800: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
4810: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
4820: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
4830: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
4840: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
4850: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
4860: 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ) );.    DbSetPr
4870: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
4880: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
4890: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
48a0: 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52 65 73  ty(db, 1, DB_Res
48b0: 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 64  etWanted);.    d
48c0: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
48d0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
48e0: 77 6e 4f 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  wnOk;.  }.  if( 
48f0: 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d  db->nSchemaLock=
4900: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
4910: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4920: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 44 62  +){.      if( Db
4930: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
4940: 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65  i, DB_ResetWante
4950: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
4960: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
4970: 4f 72 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  OrDisconnect(db,
4980: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
4990: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
49a0: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
49b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
49c0: 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  m all attached d
49d0: 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64  atabases (includ
49e0: 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e  ing.** "main" an
49f0: 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20  d "temp") for a 
4a00: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
4a10: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
4a20: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
4a30: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
4a40: 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  ection(sqlite3 *
4a50: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
4a60: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
4a70: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
4a80: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
4a90: 69 3d 28 69 3f 69 2b 31 3a 32 29 29 7b 0a 20 20  i=(i?i+1:2)){.  
4aa0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
4ab0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
4ac0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
4ad0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  .      if( db->n
4ae0: 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b  SchemaLock==0 ){
4af0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4b00: 53 63 68 65 6d 61 43 6c 65 61 72 4f 72 44 69 73  SchemaClearOrDis
4b10: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b 0a  connect(db, i);.
4b20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4b30: 20 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72       DbSetProper
4b40: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73  ty(db, i, DB_Res
4b50: 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 20  etWanted);.     
4b60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
4b70: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4b80: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
4b90: 68 65 6d 61 29 3b 0a 20 20 64 62 2d 3e 6d 44 62  hema);.  db->mDb
4ba0: 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46 4c 41  Flags &= ~(DBFLA
4bb0: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 7c 44  G_SchemaChange|D
4bc0: 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77  BFLAG_SchemaKnow
4bd0: 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nOk);.  sqlite3V
4be0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
4bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4c00: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4c10: 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61   if( db->nSchema
4c20: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Lock==0 ){.    s
4c30: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
4c40: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
4c50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
4c60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4c70: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
4c80: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
4c90: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
4ca0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
4cb0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4cc0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20  db->mDbFlags &= 
4cd0: 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  ~DBFLAG_SchemaCh
4ce0: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ange;.}../*.** D
4cf0: 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  elete memory all
4d00: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 63  ocated for the c
4d10: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61  olumn names of a
4d20: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28   table or view (
4d30: 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f  the.** Table.aCo
4d40: 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76  l[] array)..*/.v
4d50: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
4d60: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c  eColumnNames(sql
4d70: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
4d80: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
4d90: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
4da0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
4db0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
4dc0: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
4dd0: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
4de0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
4df0: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
4e00: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
4e10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4e20: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
4e30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4e40: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
4e50: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
4e60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4e70: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
4e80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
4e90: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4ea0: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >aCol);.  }.}../
4eb0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
4ec0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
4ed0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
4ee0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
4ef0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
4f00: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
4f10: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
4f20: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
4f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
4f40: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
4f50: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
4f60: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
4f70: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
4f80: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
4f90: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4fa0: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
4fb0: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
4fc0: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
4fd0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
4fe0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
4ff0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
5000: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
5010: 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65   The db paramete
5020: 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  r is optional.  
5030: 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  It is needed if 
5040: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
5050: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f   .** contains lo
5060: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20  okaside memory. 
5070: 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20   (Table objects 
5080: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f  in the schema do
5090: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b   not use.** look
50a0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75  aside memory, bu
50b0: 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c  t some ephemeral
50c0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64   Table objects d
50d0: 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64  o.)  Or the.** d
50e0: 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20  b parameter can 
50f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d  be used with db-
5100: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f  >pnBytesFreed to
5110: 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d   measure the mem
5120: 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  ory.** used by t
5130: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e  he Table object.
5140: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5150: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5160: 64 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  deleteTable(sqli
5170: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
5180: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
5190: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
51a0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
51b0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f  _DEBUG.  /* Reco
51c0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
51d0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
51e0: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
51f0: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
5200: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
5210: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
5220: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
5230: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
5240: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
5250: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
5260: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
5270: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
5280: 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  .  int nLookasid
5290: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20  e = 0;.  if( db 
52a0: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
52b0: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
52c0: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ral)==0 ){.    n
52d0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69  Lookaside = sqli
52e0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
52f0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  (db, 0);.  }.#en
5300: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
5310: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
5320: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
5330: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
5340: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
5350: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
5360: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
5370: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
5380: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
5390: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
53a0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
53b0: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
53c0: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
53d0: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
53e0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
53f0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
5400: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
5410: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
5420: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5430: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
5440: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
5450: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
5460: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
5470: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
5480: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
5490: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
54a0: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
54b0: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
54c0: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
54d0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
54e0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
54f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5500: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
5510: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
5520: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
5530: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
5540: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
5550: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
5560: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
5570: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
5580: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
5590: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
55a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
55b0: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
55c0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
55d0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
55e0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
55f0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
5600: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
5610: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
5620: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5630: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
5640: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5650: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
5660: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
5670: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5680: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
5690: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
56a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
56b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
56c0: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
56d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
56e0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
56f0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
5700: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
5710: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5720: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
5730: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
5740: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
5750: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5760: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5770: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5780: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5790: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  e==sqlite3Lookas
57a0: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b  ideUsed(db,0) );
57b0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
57c0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
57d0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
57e0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
57f0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
5800: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
5810: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
5820: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
5830: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
5840: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
5850: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
5860: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
5870: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
5880: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
5890: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
58a0: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
58b0: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
58c0: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
58d0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
58e0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
58f0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
5900: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
5910: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
5920: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
5930: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5940: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
5950: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5960: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5970: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
5980: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
5990: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
59a0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
59b0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
59c0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
59d0: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
59e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
59f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5a00: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
5a10: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
5a20: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
5a30: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
5a40: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
5a50: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
5a60: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
5a70: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
5a80: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
5a90: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
5aa0: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
5ab0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
5ac0: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
5ad0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
5ae0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
5af0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
5b00: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
5b10: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
5b20: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
5b30: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5b40: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5b50: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5b60: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5b70: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5b80: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5b90: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5ba0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5bb0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5bc0: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5bd0: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
5be0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
5bf0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
5c00: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
5c10: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
5c20: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
5c30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5c40: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5c50: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5c60: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5c70: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5c80: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5c90: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5ca0: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5cb0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5cc0: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5cd0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
5ce0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
5cf0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
5d00: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
5d10: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5d20: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
5d30: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5d40: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5d50: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5d60: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5d70: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5d90: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5da0: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5db0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5dc0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5dd0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
5de0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
5df0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
5e00: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
5e10: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
5e20: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
5e30: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5e40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5e50: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5e60: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5e70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5e80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5e90: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5ea0: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5eb0: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5ec0: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5ee0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5ef0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5f00: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5f10: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5f20: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
5f30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5f40: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5f50: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5f60: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5f70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5f80: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5f90: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5fa0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5fb0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5fc0: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5fd0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5fe0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5ff0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
6000: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
6010: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
6020: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
6030: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
6040: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
6050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
6060: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
6070: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
6080: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6090: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
60a0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
60b0: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
60c0: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
60d0: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
60e0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
60f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
6100: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
6110: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
6120: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
6130: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
6140: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
6150: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
6160: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
6170: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
6180: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
6190: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
61a0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
61b0: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
61c0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
61d0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
61e0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
61f0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
6200: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6210: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
6220: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
6230: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
6240: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
6250: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
6260: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
6270: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
6280: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
6290: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
62a0: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
62b0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
62c0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
62d0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
62e0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
62f0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
6300: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
6310: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
6320: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
6330: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6360: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
6370: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6390: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
63a0: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
63b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
63c0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
63d0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
63e0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
63f0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
6400: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6410: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
6420: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
6430: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
6440: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
6450: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
6460: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
6470: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
6480: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
6490: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
64a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
64b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
64c0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
64d0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
64e0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
64f0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6500: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6510: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6520: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
6530: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
6540: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6550: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
6560: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
6570: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
6580: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6590: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
65a0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
65b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
65c0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
65d0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
65e0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
65f0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
6600: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
6610: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
6620: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
6630: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6640: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6650: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6660: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6670: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6680: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6690: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
66a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
66b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
66c0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
66d0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
66e0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
66f0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
6700: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
6710: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
6720: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
6730: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6740: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6750: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6760: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6770: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6780: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
67a0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
67b0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
67c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
67d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
67e0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
67f0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
6800: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
6810: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
6820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6830: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6840: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6850: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6860: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6870: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6880: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6890: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
68a0: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
68b0: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
68c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
68d0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
68e0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
68f0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
6900: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
6910: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6920: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6930: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6940: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f  sy || IN_RENAME_
6950: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20  OBJECT.         
6960: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46      || (db->mDbF
6970: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
6980: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6990: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
69a0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
69b0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
69c0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
69d0: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41  *.** True if PRA
69e0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
69f0: 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74  ema is ON.*/.int
6a00: 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
6a10: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
6a20: 64 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  db){.  testcase(
6a30: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
6a40: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6a50: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6a60: 29 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  ))==0 );.  testc
6a70: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
6a80: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6a90: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
6aa0: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
6ab0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
6ac0: 72 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20  riteSchema );.  
6ad0: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
6ae0: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
6af0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
6b00: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
6b20: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b  ITE_Defensive );
6b30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6b40: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6b50: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6b60: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6b80: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6b90: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
6ba0: 73 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72  sive) );.  retur
6bb0: 6e 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  n (db->flags&(SQ
6bc0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
6bd0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
6be0: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74  e))==SQLITE_Writ
6bf0: 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eSchema;.}../*.*
6c00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6c10: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
6c20: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
6c30: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
6c40: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
6c50: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
6c60: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6c70: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6c80: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6c90: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
6ca0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
6cb0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
6cc0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
6cd0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
6ce0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
6cf0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6d00: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
6d10: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
6d20: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
6d30: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
6d40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
6d50: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
6d60: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
6d70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
6d80: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
6d90: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
6da0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
6db0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
6dc0: 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63  qlite3WritableSc
6dd0: 68 65 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29  hema(pParse->db)
6de0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
6df0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
6e00: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
6e10: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
6e20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6e30: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
6e40: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
6e50: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
6e60: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
6e70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
6e80: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
6e90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6ea0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6eb0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
6ec0: 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  dex of a table.*
6ed0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
6ee0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
6ef0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
6f00: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28  Index *p;.  for(
6f10: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  p=pTab->pIndex; 
6f20: 70 20 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b  p && !IsPrimaryK
6f30: 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d  eyIndex(p); p=p-
6f40: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75  >pNext){}.  retu
6f50: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
6f60: 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  eturn the column
6f70: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 74   of index pIdx t
6f80: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
6f90: 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75  to table.** colu
6fa0: 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e  mn iCol.  Return
6fb0: 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64   -1 if not found
6fc0: 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33  ..*/.i16 sqlite3
6fd0: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e  ColumnOfIndex(In
6fe0: 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69  dex *pIdx, i16 i
6ff0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
7000: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
7010: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
7020: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
7030: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
7040: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
7050: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
7060: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
7070: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
7080: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
7090: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
70a0: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
70b0: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
70c0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
70d0: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
70e0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
70f0: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
7100: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
7110: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
7120: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7130: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
7140: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
7150: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
7160: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
7170: 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  me. The isTemp.*
7180: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
7190: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
71a0: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
71b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
71c0: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
71d0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
71e0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
71f0: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
7200: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
7210: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
7220: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
7230: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
7240: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
7250: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
7260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
7270: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
7280: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
7290: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
72a0: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
72b0: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
72c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
72d0: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
72e0: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
72f0: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
7300: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
7310: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
7320: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
7330: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
7340: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
7350: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
7360: 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  he sqlite3EndTab
7370: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
7380: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
7390: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
73a0: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
73b0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
73c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
73d0: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
73e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
73f0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
7400: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
7410: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
7420: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
7430: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
7440: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
7450: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
7460: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65  cond part of the
7470: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
7480: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
7490: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
74a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
74b0: 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65   is a TEMP table
74c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
74d0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
74e0: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57  f this is a VIEW
74f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74   */.  int isVirt
7500: 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69  ual,   /* True i
7510: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54  f this is a VIRT
7520: 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  UAL table */.  i
7530: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
7540: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
7550: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
7560: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
7570: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63  ble *pTable;.  c
7580: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
7590: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
75a0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
75b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
75c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
75d0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
75e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
75f0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
7600: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
7610: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
7620: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
7630: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
7640: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
7650: 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64  eate */..  if( d
7660: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
7670: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
7680: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70  ==1 ){.    /* Sp
7690: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72  ecial case:  Par
76a0: 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  sing the sqlite_
76b0: 6d 61 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65  master or sqlite
76c0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68  _temp_master sch
76d0: 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ema */.    iDb =
76e0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
76f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7700: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 53  e3DbStrDup(db, S
7710: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
7720: 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70  );.    pName = p
7730: 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name1;.  }else{.
7740: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f      /* The commo
7750: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44  n case */.    iD
7760: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
7770: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
7780: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
7790: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
77a0: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
77b0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
77c0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
77d0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26  & pName2->n>0 &&
77e0: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20   iDb!=1 ){.     
77f0: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
7800: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
7810: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
7820: 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c  e qualified. Unl
7830: 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ess .      ** th
7840: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
7850: 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79  is "temp" anyway
7860: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  .  */.      sqli
7870: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7880: 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74  se, "temporary t
7890: 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  able name must b
78a0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b  e unqualified");
78b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
78c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
78d0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
78e0: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20  emp ) iDb = 1;. 
78f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7900: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
7910: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
7920: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
7930: 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71  JECT ){.      sq
7940: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
7950: 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
7960: 64 2a 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29  d*)zName, pName)
7970: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
7980: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
7990: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28   = *pName;.  if(
79a0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
79b0: 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  rn;.  if( SQLITE
79c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
79d0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
79e0: 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
79f0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7a00: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
7a10: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  if( db->init.iDb
7a20: 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31  ==1 ) isTemp = 1
7a30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7a40: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
7a50: 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73  ION.  assert( is
7a60: 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  Temp==0 || isTem
7a70: 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
7a80: 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69  ( isView==0 || i
7a90: 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a  sView==1 );.  {.
7aa0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7ab0: 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a   u8 aCode[] = {.
7ac0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52         SQLITE_CR
7ad0: 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20  EATE_TABLE,.    
7ae0: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
7af0: 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20  _TEMP_TABLE,.   
7b00: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7b10: 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53  E_VIEW,.       S
7b20: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7b30: 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20  P_VIEW.    };.  
7b40: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
7b50: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
7b60: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
7b70: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
7b80: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
7b90: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
7ba0: 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
7bb0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
7bc0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7bd0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
7be0: 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20  ( !isVirtual && 
7bf0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
7c00: 28 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43  (pParse, (int)aC
7c10: 6f 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56  ode[isTemp+2*isV
7c20: 69 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  iew],.          
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
7c50: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
7c60: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7c70: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7c80: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
7c90: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
7ca0: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
7cb0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
7cc0: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
7cd0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
7ce0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
7cf0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
7d00: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
7d10: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
7d20: 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65  * it does. The e
7d30: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
7d40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  he statement bei
7d50: 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61  ng parsed was pa
7d60: 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20  ssed.  ** to an 
7d70: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
7d80: 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20  vtab() call. In 
7d90: 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74  that case only t
7da0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  he column names.
7db0: 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77    ** and types w
7dc0: 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20  ill be used, so 
7dd0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
7de0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d   to test for nam
7df0: 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c  espace.  ** coll
7e00: 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  isions..  */.  i
7e10: 66 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50  f( !IN_SPECIAL_P
7e20: 41 52 53 45 20 29 7b 0a 20 20 20 20 63 68 61 72  ARSE ){.    char
7e30: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7e40: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7e50: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
7e60: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
7e70: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
7e80: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7e90: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7ea0: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
7eb0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
7ec0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
7ed0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
7ee0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e   ){.      if( !n
7ef0: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  oErr ){.        
7f00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7f10: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
7f20: 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  T already exists
7f30: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", pName);.     
7f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7f50: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
7f60: 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55 50  t.busy || CORRUP
7f70: 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20  T_DB );.        
7f80: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
7f90: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
7fa0: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
7fb0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7fc0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7fd0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
7fe0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
7ff0: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
8000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8020: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
8030: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
8040: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
8050: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
8060: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
8070: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
8080: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8090: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
80a0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
80b0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
80c0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
80d0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
80e0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
80f0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
8100: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
8110: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
8120: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
8130: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
8140: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
8150: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
8160: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
8170: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
8180: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
8190: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d  Table->nTabRef =
81a0: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
81b0: 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54  E_DEFAULT_ROWEST
81c0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
81d0: 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  ogEst = sqlite3L
81e0: 6f 67 45 73 74 28 53 51 4c 49 54 45 5f 44 45 46  ogEst(SQLITE_DEF
81f0: 41 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65  AULT_ROWEST);.#e
8200: 6c 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52  lse.  pTable->nR
8210: 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
8220: 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
8230: 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
8240: 37 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  76) );.#endif.  
8250: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
8260: 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  pNewTable==0 );.
8270: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
8280: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
8290: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
82a0: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
82b0: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
82c0: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
82d0: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
82e0: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
82f0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
8300: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
8310: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
8320: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
8330: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
8340: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
8350: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8360: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
8370: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73  ENT.  if( !pPars
8380: 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72  e->nested && str
8390: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
83a0: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
83b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
83c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
83d0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
83e0: 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  0) );.    pTable
83f0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
8400: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
8410: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
8420: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
8430: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
8440: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
8450: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
8460: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
8470: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
8480: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
8490: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
84a0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
84b0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
84c0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
84d0: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
84e0: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
84f0: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
8500: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
8510: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
8520: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
8530: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
8540: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
8550: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
8560: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
8570: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
8580: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
8590: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
85a0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
85b0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
85c0: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
85d0: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
85e0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
85f0: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
8600: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
8610: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
8620: 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f  ;.    int fileFo
8630: 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65  rmat;.    int re
8640: 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a  g1, reg2, reg3;.
8650: 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d      /* nullRow[]
8660: 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64   is an OP_Record
8670: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
8680: 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20  ow containing 5 
8690: 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61  NULLs */.    sta
86a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
86b0: 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20  ullRow[] = { 6, 
86c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  0, 0, 0, 0, 0 };
86d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
86e0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
86f0: 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
8700: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8710: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8720: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
8730: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
8740: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8750: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
8760: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8770: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
8780: 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64  format and encod
8790: 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62  ing in the datab
87a0: 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  ase have not bee
87b0: 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73  n set, .    ** s
87c0: 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20  et them now..   
87d0: 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70   */.    reg1 = p
87e0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20  Parse->regRowid 
87f0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
8800: 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61  ;.    reg2 = pPa
8810: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b  rse->regRoot = +
8820: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8830: 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72     reg3 = ++pPar
8840: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
8850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8860: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
8870: 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52  , iDb, reg3, BTR
8880: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b  EE_FILE_FORMAT);
8890: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
88a0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
88b0: 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  );.    addr1 = s
88c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
88d0: 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29  (v, OP_If, reg3)
88e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
88f0: 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61  );.    fileForma
8900: 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  t = (db->flags &
8910: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
8920: 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20  leFmt)!=0 ?.    
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
8940: 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c  : SQLITE_MAX_FIL
8950: 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71  E_FORMAT;.    sq
8960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8970: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
8980: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
8990: 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72  _FORMAT, fileFor
89a0: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
89b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
89c0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
89d0: 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43  , BTREE_TEXT_ENC
89e0: 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b  ODING, ENC(db));
89f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8a00: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
8a10: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
8a20: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
8a30: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
8a40: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
8a50: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
8a60: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
8a70: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
8a80: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
8a90: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
8aa0: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
8ab0: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
8ac0: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
8ad0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
8ae0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
8af0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
8b00: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
8b10: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
8b20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
8b30: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
8b40: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
8b50: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
8b60: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
8b70: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
8b80: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
8b90: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
8ba0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8bb0: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
8bc0: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
8bd0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
8be0: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
8bf0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
8c00: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
8c10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
8c20: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8c30: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8c40: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
8c50: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
8c60: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8c70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8c80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8c90: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
8ca0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
8cb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72      pParse->addr
8cc0: 43 72 54 61 62 20 3d 0a 20 20 20 20 20 20 20 20  CrTab =.        
8cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ce0: 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42  p3(v, OP_CreateB
8cf0: 74 72 65 65 2c 20 69 44 62 2c 20 72 65 67 32 2c  tree, iDb, reg2,
8d00: 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a   BTREE_INTKEY);.
8d10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8d20: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
8d30: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
8d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8d50: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
8d60: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
8d70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8d80: 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
8d90: 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c   6, reg3, 0, nul
8da0: 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29  lRow, P4_STATIC)
8db0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8dc0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8dd0: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
8de0: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8df0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8e00: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8e10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8e20: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
8e30: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
8e40: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
8e50: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
8e60: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
8e70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8e80: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
8e90: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
8ea0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
8eb0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
8ec0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
8ed0: 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f  Set properties o
8ee0: 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  f a table column
8ef0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d   based on the (m
8f00: 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20  agical).** name 
8f10: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  of the column..*
8f20: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
8f30: 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d  BLE_HIDDEN_COLUM
8f40: 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  NS.void sqlite3C
8f50: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
8f60: 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70  romName(Table *p
8f70: 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  Tab, Column *pCo
8f80: 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l){.  if( sqlite
8f90: 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d  3_strnicmp(pCol-
8fa0: 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65  >zName, "__hidde
8fb0: 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  n__", 10)==0 ){.
8fc0: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8fd0: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49  gs |= COLFLAG_HI
8fe0: 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DDEN;.  }else if
8ff0: 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d  ( pTab && pCol!=
9000: 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70  pTab->aCol && (p
9010: 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73  Col[-1].colFlags
9020: 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
9030: 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  N) ){.    pTab->
9040: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f  tabFlags |= TF_O
9050: 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a  OOHidden;.  }.}.
9060: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
9070: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
9080: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
9090: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
90a0: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
90b0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
90c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
90d0: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
90e0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
90f0: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
9100: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
9110: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
9120: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
9130: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
9140: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
9150: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
9160: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
9170: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
9180: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9190: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
91a0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
91b0: 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  ame, Token *pTyp
91c0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
91d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
91e0: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  *z;.  char *zTyp
91f0: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
9200: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
9210: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9220: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
9230: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
9240: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
9250: 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c  p->nCol+1>db->aL
9260: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
9270: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
9280: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9290: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
92a0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73  ny columns on %s
92b0: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
92c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
92d0: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  z = sqlite3DbMal
92e0: 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65  locRaw(db, pName
92f0: 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b  ->n + pType->n +
9300: 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   2);.  if( z==0 
9310: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
9320: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
9330: 20 29 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65   ) sqlite3Rename
9340: 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
9350: 20 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65   (void*)z, pName
9360: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  );.  memcpy(z, p
9370: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
9380: 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e  n);.  z[pName->n
9390: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
93a0: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
93b0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
93c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
93d0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
93e0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
93f0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
9400: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9410: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
9420: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
9430: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
9440: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9450: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
9460: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
9470: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
9480: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
9490: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
94a0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
94b0: 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43  Realloc(db,p->aC
94c0: 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  ol,(p->nCol+8)*s
94d0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
94e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
94f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
9500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9510: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
9520: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
9530: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
9540: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
9550: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
9560: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
9570: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
9580: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
9590: 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  = z;.  sqlite3Co
95a0: 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
95b0: 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b  omName(p, pCol);
95c0: 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e  . .  if( pType->
95d0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  n==0 ){.    /* I
95e0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
95f0: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
9600: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
9610: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
9620: 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69      ** 'BLOB' wi
9630: 74 68 20 61 20 64 65 66 61 75 6c 74 20 73 69 7a  th a default siz
9640: 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20 2a 2f  e of 4 bytes. */
9650: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
9660: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
9670: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d  _BLOB;.    pCol-
9680: 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66 64  >szEst = 1;.#ifd
9690: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
96a0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
96b0: 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d 73 71  ES.    if( 4>=sq
96c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
96d0: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
96e0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
96f0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
9700: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
9710: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
9720: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a 20  {.    zType = z 
9730: 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
9740: 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65  0(z) + 1;.    me
9750: 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79 70  mcpy(zType, pTyp
9760: 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b  e->z, pType->n);
9770: 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70 65  .    zType[pType
9780: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  ->n] = 0;.    sq
9790: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54 79  lite3Dequote(zTy
97a0: 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  pe);.    pCol->a
97b0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
97c0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54  3AffinityType(zT
97d0: 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20  ype, pCol);.    
97e0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
97f0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50  = COLFLAG_HASTYP
9800: 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c  E;.  }.  p->nCol
9810: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  ++;.  pParse->co
9820: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d  nstraintName.n =
9830: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
9840: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9850: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
9860: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
9870: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
9880: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
9890: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
98a0: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
98b0: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
98c0: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
98d0: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
98e0: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
98f0: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
9900: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
9910: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9920: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
9930: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
9940: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
9950: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
9960: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
9970: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d  umn *pCol;.  p =
9980: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9990: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
99a0: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
99b0: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
99c0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
99d0: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f  ->nCol-1];.  pCo
99e0: 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  l->notNull = (u8
99f0: 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74  )onError;.  p->t
9a00: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
9a10: 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20  sNotNull;..  /* 
9a20: 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e  Set the uniqNotN
9a30: 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20  ull flag on any 
9a40: 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69 6e 64  UNIQUE or PK ind
9a50: 65 78 65 73 20 61 6c 72 65 61 64 79 20 63 72 65  exes already cre
9a60: 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ated.  ** on thi
9a70: 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20  s column.  */.  
9a80: 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61  if( pCol->colFla
9a90: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49  gs & COLFLAG_UNI
9aa0: 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  QUE ){.    Index
9ab0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
9ac0: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
9ad0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
9ae0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
9af0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65  ssert( pIdx->nKe
9b00: 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d  yCol==1 && pIdx-
9b10: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
9b20: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e );.      if( p
9b30: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
9b40: 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20  ==p->nCol-1 ){. 
9b50: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69         pIdx->uni
9b60: 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  qNotNull = 1;.  
9b70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
9b90: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
9ba0: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
9bb0: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
9bc0: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
9bd0: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
9be0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
9bf0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
9c00: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
9c10: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
9c20: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
9c30: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
9c40: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
9c50: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
9c60: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
9c70: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
9c80: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
9c90: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
9ca0: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
9cb0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
9cc0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
9cd0: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
9ce0: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
9cf0: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
9d00: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
9d10: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
9d20: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
9d30: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
9d40: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
9d50: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
9d60: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
9d70: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
9d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d90: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
9da0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9db0: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
9dc0: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
9dd0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
9de0: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
9df0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9e00: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
9e10: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
9e20: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
9e30: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9e40: 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20  _BLOB.** 'REAL' 
9e50: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9e60: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
9e70: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
9e80: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
9e90: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
9ea0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
9eb0: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
9ec0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
9ed0: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
9ee0: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
9ef0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9f00: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
9f10: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
9f20: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
9f30: 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c  t char *zIn, Col
9f40: 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33  umn *pCol){.  u3
9f50: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
9f60: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9f70: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73  _NUMERIC;.  cons
9f80: 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20  t char *zChar = 
9f90: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 49  0;..  assert( zI
9fa0: 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  n!=0 );.  while(
9fb0: 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68   zIn[0] ){.    h
9fc0: 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69   = (h<<8) + sqli
9fd0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
9fe0: 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20  (*zIn)&0xff];.  
9ff0: 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28    zIn++;.    if(
a000: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
a010: 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'h'<<16)+('a'<<8
a020: 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20  )+'r') ){       
a030: 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f        /* CHAR */
a040: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
a050: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
a060: 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b      zChar = zIn;
a070: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
a080: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c  ==(('c'<<24)+('l
a090: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
a0a0: 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  'b') ){       /*
a0b0: 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61   CLOB */.      a
a0c0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
a0d0: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
a0e0: 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34  if( h==(('t'<<24
a0f0: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27  )+('e'<<16)+('x'
a100: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
a110: 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20     /* TEXT */.  
a120: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
a130: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
a140: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62  else if( h==(('b
a150: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
a160: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('o'<<8)+'b')  
a170: 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20          /* BLOB 
a180: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61  */.        && (a
a190: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a1a0: 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53  UMERIC || aff==S
a1b0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20  QLITE_AFF_REAL) 
a1c0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
a1d0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
a1e0: 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d        if( zIn[0]
a1f0: 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20  =='(' ) zChar = 
a200: 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  zIn;.#ifndef SQL
a210: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
a220: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73  G_POINT.    }els
a230: 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c  e if( h==(('r'<<
a240: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
a250: 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20  a'<<8)+'l')     
a260: 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a       /* REAL */.
a270: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
a280: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a290: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
a2a0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
a2b0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
a2c0: 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28   h==(('f'<<24)+(
a2d0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
a2e0: 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20  )+'a')          
a2f0: 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20  /* FLOA */.     
a300: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
a310: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
a320: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
a330: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
a340: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
a350: 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c  ('d'<<24)+('o'<<
a360: 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27  16)+('u'<<8)+'b'
a370: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f  )          /* DO
a380: 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  UB */.        &&
a390: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a3a0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
a3b0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
a3c0: 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a  FF_REAL;.#endif.
a3d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68      }else if( (h
a3e0: 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28  &0x00FFFFFF)==((
a3f0: 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38  'i'<<16)+('n'<<8
a400: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20  )+'t') ){    /* 
a410: 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  INT */.      aff
a420: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
a430: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
a440: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
a450: 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73 20 6e   /* If pCol is n
a460: 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61  ot NULL, store a
a470: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
a480: 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54  e field size.  T
a490: 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65  he.  ** estimate
a4a0: 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68   is scaled so th
a4b0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  at the size of a
a4c0: 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20  n integer is 1. 
a4d0: 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20 29   */.  if( pCol )
a4e0: 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b  {.    int v = 0;
a4f0: 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69     /* default si
a500: 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62  ze is approx 4 b
a510: 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ytes */.    if( 
a520: 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e  aff<SQLITE_AFF_N
a530: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
a540: 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20  if( zChar ){.   
a550: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61       while( zCha
a560: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[0] ){.        
a570: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64    if( sqlite3Isd
a580: 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29  igit(zChar[0]) )
a590: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
a5a0: 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41   BLOB(k), VARCHA
a5b0: 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e  R(k), CHAR(k) ->
a5c0: 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20   r=(k/4+1) */.  
a5d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a5e0: 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c  3GetInt32(zChar,
a5f0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
a600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a610: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
a620: 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Char++;.        
a630: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
a640: 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b 20 20         v = 16;  
a650: 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20   /* BLOB, TEXT, 
a660: 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70  CLOB -> r=5  (ap
a670: 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f  prox 20 bytes)*/
a680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
a690: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a6a0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
a6b0: 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 76 3e  ENCES.    if( v>
a6c0: 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  =sqlite3GlobalCo
a6d0: 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66  nfig.szSorterRef
a6e0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
a6f0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
a700: 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20  LAG_SORTERREF;. 
a710: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a720: 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20  v = v/4 + 1;.   
a730: 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d   if( v>255 ) v =
a740: 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e   255;.    pCol->
a750: 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  szEst = v;.  }. 
a760: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
a770: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
a780: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
a790: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
a7a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
a7b0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
a7c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
a7d0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
a7e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
a7f0: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
a800: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
a810: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
a820: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
a830: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
a840: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
a850: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a860: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
a870: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
a880: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
a890: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
a8a0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a8b0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
a8c0: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
a8d0: 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ue(.  Parse *pPa
a8e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
a8f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a900: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
a910: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
a920: 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 65 78  /* The parsed ex
a930: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
a940: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  default value */
a950: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a960: 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a 20 53  Start,      /* S
a970: 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 66 61  tart of the defa
a980: 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a  ult value text *
a990: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a9a0: 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f 2a 20  zEnd         /* 
a9b0: 46 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  First character 
a9c0: 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65 66 61  past end of defa
a9d0: 75 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f  ut value text */
a9e0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
a9f0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
aa00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
aa10: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20  pParse->db;.  p 
aa20: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
aa30: 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20  ble;.  if( p!=0 
aa40: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
aa50: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
aa60: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
aa70: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
aa80: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45  antOrFunction(pE
aa90: 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  xpr, db->init.bu
aaa0: 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sy) ){.      sql
aab0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
aac0: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
aad0: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
aae0: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
aaf0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
ab00: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
ab10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
ab20: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
ab30: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
ab40: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
ab50: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
ab60: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
ab70: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
ab80: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
ab90: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
aba0: 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20    Expr x;.      
abb0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
abc0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
abd0: 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  t);.      memset
abe0: 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78  (&x, 0, sizeof(x
abf0: 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d  ));.      x.op =
ac00: 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20   TK_SPAN;.      
ac10: 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c  x.u.zToken = sql
ac20: 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64 62  ite3DbSpanDup(db
ac30: 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b  , zStart, zEnd);
ac40: 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d  .      x.pLeft =
ac50: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78 2e   pExpr;.      x.
ac60: 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b  flags = EP_Skip;
ac70: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66  .      pCol->pDf
ac80: 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
ac90: 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50 52  Dup(db, &x, EXPR
aca0: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
acb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
acc0: 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29  (db, x.u.zToken)
acd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
ace0: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
acf0: 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CT ){.    sqlite
ad00: 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70  3RenameExprUnmap
ad10: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
ad20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
ad30: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
ad40: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61  pr);.}../*.** Ba
ad50: 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62  ckwards Compatib
ad60: 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a  ility Hack:.** .
ad70: 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65  ** Historical ve
ad80: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
ad90: 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e 67   accepted string
ada0: 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s as column name
adb0: 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20  s in.** indexes 
adc0: 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20  and PRIMARY KEY 
add0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20  constraints and 
ade0: 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  in UNIQUE constr
adf0: 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a  aints.  Example:
ae00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  .**.**     CREAT
ae10: 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c  E TABLE xyz(a,b,
ae20: 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45  c,d,e,PRIMARY KE
ae30: 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62  Y('a'),UNIQUE('b
ae40: 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72  ','c' COLLATE tr
ae50: 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  im).**     CREAT
ae60: 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78  E INDEX abc ON x
ae70: 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c  yz('c','d' DESC,
ae80: 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  'e' COLLATE noca
ae90: 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20  se DESC);.**.** 
aea0: 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20  This is goofy.  
aeb0: 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65 20  But to preserve 
aec0: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
aed0: 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69  ibility we conti
aee0: 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74  nue to.** accept
aef0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
af00: 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65  ne does the nece
af10: 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e  ssary conversion
af20: 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a  .  It converts.*
af30: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
af40: 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72   given in its ar
af50: 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b  gument from a TK
af60: 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54  _STRING into a T
af70: 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65  K_ID.** if the e
af80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73  xpression is jus
af90: 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69  t a TK_STRING wi
afa0: 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43  th an optional C
afb0: 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a  OLLATE clause..*
afc0: 2a 20 49 66 20 74 68 65 20 65 70 78 72 65 73 73  * If the epxress
afd0: 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20  ion is anything 
afe0: 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54  other than TK_ST
aff0: 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73  RING, the expres
b000: 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61  sion is.** uncha
b010: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
b020: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72 69  void sqlite3Stri
b030: 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b  ngToId(Expr *p){
b040: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
b050: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70  _STRING ){.    p
b060: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20  ->op = TK_ID;.  
b070: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
b080: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70  =TK_COLLATE && p
b090: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
b0a0: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d  STRING ){.    p-
b0b0: 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f  >pLeft->op = TK_
b0c0: 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ID;.  }.}../*.**
b0d0: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
b0e0: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
b0f0: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
b100: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
b110: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
b120: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
b130: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
b140: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
b150: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
b160: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
b170: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
b180: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
b190: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
b1a0: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
b1b0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
b1c0: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
b1d0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
b1e0: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
b1f0: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
b200: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
b210: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
b220: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
b230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
b240: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
b250: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
b260: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
b270: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
b280: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
b290: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
b2a0: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e  mn as the rowid.
b2b0: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
b2c0: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
b2d0: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
b2e0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
b2f0: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
b300: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
b310: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
b320: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
b330: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
b340: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
b350: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
b360: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
b370: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
b380: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
b390: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
b3a0: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
b3b0: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
b3c0: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
b3d0: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
b3e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
b3f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
b400: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  ddPrimaryKey(.  
b410: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b420: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b430: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
b440: 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c  st *pList,  /* L
b450: 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d  ist of field nam
b460: 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  es to be indexed
b470: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
b480: 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  r,      /* What 
b490: 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69  to do with a uni
b4a0: 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74  queness conflict
b4b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e   */.  int autoIn
b4c0: 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  c,      /* True 
b4d0: 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45  if the AUTOINCRE
b4e0: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20  MENT keyword is 
b4f0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
b500: 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f   sortOrder     /
b510: 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  * SQLITE_SO_ASC 
b520: 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  or SQLITE_SO_DES
b530: 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  C */.){.  Table 
b540: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
b550: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c  pNewTable;.  Col
b560: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
b570: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
b580: 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  i;.  int nTerm;.
b590: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
b5a0: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
b5b0: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
b5c0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
b5d0: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29  _HasPrimaryKey )
b5e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b5f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
b600: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
b610: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
b620: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
b630: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
b640: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
b650: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
b660: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
b670: 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72   |= TF_HasPrimar
b680: 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73  yKey;.  if( pLis
b690: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
b6a0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
b6b0: 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  1;.    pCol = &p
b6c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
b6d0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
b6e0: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50  ags |= COLFLAG_P
b6f0: 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72  RIMKEY;.    nTer
b700: 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 1;.  }else{.
b710: 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73      nTerm = pLis
b720: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f  t->nExpr;.    fo
b730: 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
b740: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
b750: 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74   *pCExpr = sqlit
b760: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
b770: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
b780: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  xpr);.      asse
b790: 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b  rt( pCExpr!=0 );
b7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
b7b0: 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29  ringToId(pCExpr)
b7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45 78  ;.      if( pCEx
b7d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
b7e0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
b7f0: 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43  har *zCName = pC
b800: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
b810: 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c          for(iCol
b820: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
b830: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
b840: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
b850: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d  te3StrICmp(zCNam
b860: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
b870: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
b880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
b890: 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
b8a0: 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20  iCol];.         
b8b0: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
b8c0: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
b8d0: 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MKEY;.          
b8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b8f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b910: 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a  .  if( nTerm==1.
b920: 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 26     && pCol.   &&
b930: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
b940: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
b950: 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54  e(pCol,""), "INT
b960: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20  EGER")==0.   && 
b970: 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54  sortOrder!=SQLIT
b980: 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20  E_SO_DESC.  ){. 
b990: 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
b9a0: 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74  _OBJECT && pList
b9b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b9c0: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
b9d0: 70 28 70 50 61 72 73 65 2c 20 26 70 54 61 62 2d  p(pParse, &pTab-
b9e0: 3e 69 50 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61  >iPKey, pList->a
b9f0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
ba00: 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  }.    pTab->iPKe
ba10: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
ba20: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
ba30: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
ba40: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
ba50: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
ba60: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
ba70: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
ba80: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
ba90: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
baa0: 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   ) pParse->iPkSo
bab0: 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d  rtOrder = pList-
bac0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
bad0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
bae0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
baf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
bb00: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
bb10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bb20: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
bb30: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
bb40: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
bb50: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
bb60: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
bb70: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
bb80: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
bb90: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
bba0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
bbb0: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20    0, sortOrder, 
bbe0: 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50  0, SQLITE_IDXTYP
bbf0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20  E_PRIMARYKEY);. 
bc00: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
bc10: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
bc20: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
bc30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
bc40: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
bc50: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
bc60: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
bc70: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
bc80: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
bc90: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
bca0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
bcb0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
bcc0: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
bcd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bce0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bcf0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
bd00: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
bd10: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
bd20: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
bd30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
bd40: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
bd50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
bd60: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
bd70: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bd80: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20  ;.  if( pTab && 
bd90: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
bda0: 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 42  .   && !sqlite3B
bdb0: 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64  treeIsReadonly(d
bdc0: 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e  b->aDb[db->init.
bdd0: 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20  iDb].pBt).  ){. 
bde0: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
bdf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
be00: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
be10: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43  pTab->pCheck, pC
be20: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69  heckExpr);.    i
be30: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  f( pParse->const
be40: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20  raintName.n ){. 
be50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
be60: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
be70: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
be80: 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  , &pParse->const
be90: 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20  raintName, 1);. 
bea0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
beb0: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
bec0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
bed0: 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b  arse->db, pCheck
bee0: 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Expr);.  }.}../*
bef0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
bf00: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
bf10: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
bf20: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
bf30: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
bf40: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
bf50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bf60: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
bf70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
bf80: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
bf90: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
bfa0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
bfb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
bfc0: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
bfd0: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
bfe0: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
bff0: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
c000: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
c010: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
c020: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
c030: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
c040: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
c050: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
c060: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
c070: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
c080: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
c090: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
c0a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
c0b0: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  Coll) ){.    Ind
c0c0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71  ex *pIdx;.    sq
c0d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c0e0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
c0f0: 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  );.    p->aCol[i
c100: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
c110: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
c120: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
c130: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
c140: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
c150: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
c160: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
c170: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
c180: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
c190: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
c1a0: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
c1b0: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
c1c0: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
c1d0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
c1e0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
c1f0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
c200: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
c210: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
c220: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
c230: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  KeyCol==1 );.   
c240: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
c250: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
c260: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
c270: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
c280: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
c290: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
c2a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
c2b0: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
c2c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
c2d0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
c2e0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
c2f0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
c300: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
c310: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
c320: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
c330: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
c340: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
c350: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
c360: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
c370: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
c380: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
c390: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
c3a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
c3b0: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
c3c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
c3d0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
c3e0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
c3f0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
c400: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
c410: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
c420: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
c430: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
c440: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
c450: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
c460: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
c470: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
c480: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
c490: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
c4a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
c4b0: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
c4c0: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
c4d0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
c4e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
c4f0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
c500: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
c510: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
c520: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
c530: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c540: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
c550: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
c560: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
c570: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
c580: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
c590: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
c5a0: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
c5b0: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
c5c0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
c5d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
c5e0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
c5f0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
c600: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
c610: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
c620: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
c630: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
c640: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
c650: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
c660: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c670: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
c680: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
c690: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
c6a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
c6b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
c6c0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
c6d0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
c6e0: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
c6f0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
c700: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
c710: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
c720: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
c730: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
c740: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e  llSeq(pParse, en
c750: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
c760: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
c770: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
c780: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
c790: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
c7a0: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
c7b0: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
c7c0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
c7d0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
c7e0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
c7f0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
c800: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
c810: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
c820: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
c830: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
c840: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
c850: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
c860: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
c870: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
c880: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
c890: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
c8a0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
c8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
c8c0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
c8d0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
c8e0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
c8f0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
c900: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
c910: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
c920: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
c930: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
c940: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
c950: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
c960: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
c970: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
c980: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
c990: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
c9a0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
c9b0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
c9c0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
c9d0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
c9e0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
c9f0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
ca00: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
ca10: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
ca20: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
ca30: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
ca40: 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49   enough..**.** I
ca50: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
ca60: 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20  : R-34230-56049 
ca70: 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63  SQLite automatic
ca80: 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a  ally increments.
ca90: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
caa0: 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74  rsion whenever t
cab0: 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  he schema change
cac0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
cad0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
cae0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
caf0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
cb00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
cb10: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
cb20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
cb30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cb40: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
cb50: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
cb60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb70: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
cb80: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53  ie, iDb, BTREE_S
cb90: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a  CHEMA_VERSION, .
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73 69     (int)(1+(unsi
cbc0: 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44 62  gned)db->aDb[iDb
cbd0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
cbe0: 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f  a_cookie));.}../
cbf0: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
cc00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
cc10: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
cc20: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
cc30: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
cc40: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
cc50: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
cc60: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
cc70: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
cc80: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
cc90: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
cca0: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
ccb0: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
ccc0: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
ccd0: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
cce0: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
ccf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cd00: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
cd10: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
cd20: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
cd30: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
cd40: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
cd50: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
cd60: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
cd70: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
cd80: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
cd90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
cda0: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
cdb0: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
cdc0: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
cdd0: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
cde0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
cdf0: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
ce00: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
ce10: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
ce20: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
ce30: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
ce40: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
ce50: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
ce60: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
ce70: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
ce80: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
ce90: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
cea0: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
ceb0: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
cec0: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
ced0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
cee0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
cef0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
cf00: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
cf10: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
cf20: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
cf30: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
cf40: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
cf50: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
cf60: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
cf70: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
cf80: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
cf90: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
cfa0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cfb0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
cfc0: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
cfd0: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
cfe0: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
cff0: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
d000: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
d010: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
d020: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
d030: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
d040: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
d050: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
d060: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
d070: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
d080: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
d090: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
d0a0: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
d0b0: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
d0c0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
d0d0: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
d0e0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
d0f0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
d100: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
d110: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
d120: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
d130: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
d140: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
d150: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20  ent, j)!=TK_ID. 
d160: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49             || zI
d170: 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20  dent[j]!=0.     
d180: 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a         || j==0;.
d190: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
d1a0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
d1b0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
d1c0: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
d1d0: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
d1e0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
d1f0: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
d200: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
d210: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
d220: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
d230: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
d240: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
d250: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
d260: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
d270: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
d280: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
d290: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
d2a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
d2b0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
d2c0: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
d2d0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
d2e0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
d2f0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
d300: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
d310: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
d320: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
d330: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
d340: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
d350: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
d360: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
d370: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
d380: 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  d;.  Column *pCo
d390: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
d3a0: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
d3b0: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
d3c0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
d3d0: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
d3e0: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
d3f0: 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b  ) + 5;.  }.  n +
d400: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
d410: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
d420: 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70  <50 ){ .    zSep
d430: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
d440: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
d450: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
d460: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
d470: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
d480: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
d490: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
d4a0: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
d4b0: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
d4c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
d4d0: 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  aw(0, n);.  if( 
d4e0: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
d4f0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
d500: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
d510: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
d520: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
d530: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
d540: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
d550: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
d560: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
d570: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
d580: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
d590: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
d5a0: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
d5b0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
d5c0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
d5d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
d5e0: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
d5f0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
d600: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
d610: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
d620: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d630: 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45  _TEXT    */ " TE
d640: 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  XT",.        /* 
d650: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
d660: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
d670: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
d680: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
d690: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
d6a0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
d6b0: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
d6c0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
d6d0: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
d6e0: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
d6f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
d700: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
d710: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
d720: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d730: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
d740: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
d750: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
d760: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
d770: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
d780: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
d790: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
d7a0: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
d7b0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
d7c0: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
d7d0: 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  OB < ArraySize(a
d7e0: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
d7f0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
d800: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d810: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74  FF_BLOB );.    t
d820: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
d830: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d840: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
d850: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
d860: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
d870: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
d880: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
d890: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
d8a0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
d8b0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
d8c0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d8d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
d8e0: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
d8f0: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
d900: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
d910: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a  LITE_AFF_BLOB];.
d920: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
d930: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
d940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
d950: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
d960: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20  LITE_AFF_BLOB . 
d970: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
d980: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
d990: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
d9a0: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
d9b0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
d9c0: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
d9d0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
d9e0: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
d9f0: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
da00: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
da10: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
da20: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
da30: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
da40: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
da50: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
da60: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
da70: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
da80: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
da90: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
daa0: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
dab0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
dac0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
dad0: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
dae0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
daf0: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
db00: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
db10: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
db20: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
db30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
db40: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
db50: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
db60: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
db70: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
db80: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
db90: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
dba0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
dbb0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
dbc0: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
dbd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
dbe0: 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  T;.  memcpy(zExt
dbf0: 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ra, pIdx->azColl
dc00: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  , sizeof(char*)*
dc10: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
dc20: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
dc30: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a   (const char**)z
dc40: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
dc50: 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  += sizeof(char*)
dc60: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
dc70: 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  tra, pIdx->aiCol
dc80: 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29  umn, sizeof(i16)
dc90: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
dca0: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
dcb0: 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61  n = (i16*)zExtra
dcc0: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
dcd0: 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d  zeof(i16)*N;.  m
dce0: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
dcf0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  dx->aSortOrder, 
dd00: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
dd10: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
dd20: 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61  er = (u8*)zExtra
dd30: 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
dd40: 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69  n = N;.  pIdx->i
dd50: 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20  sResized = 1;.  
dd60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dd70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
dd80: 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f  ate the total ro
dd90: 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61  w width for a ta
dda0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
ddb0: 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c  oid estimateTabl
ddc0: 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54  eWidth(Table *pT
ddd0: 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ab){.  unsigned 
dde0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  wTable = 0;.  co
ddf0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
de00: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
de10: 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c  for(i=pTab->nCol
de20: 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
de30: 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  aCol; i>0; i--, 
de40: 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
de50: 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f  wTable += pTabCo
de60: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  l->szEst;.  }.  
de70: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  if( pTab->iPKey<
de80: 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20  0 ) wTable++;.  
de90: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
dea0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
deb0: 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  Table*4);.}../*.
dec0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
ded0: 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
dee0: 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64  a row for an ind
def0: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
df00: 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78  id estimateIndex
df10: 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64  Width(Index *pId
df20: 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  x){.  unsigned w
df30: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74  Index = 0;.  int
df40: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   i;.  const Colu
df50: 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d  mn *aCol = pIdx-
df60: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20  >pTable->aCol;. 
df70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
df80: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
df90: 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64  .    i16 x = pId
dfa0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
dfb0: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49      assert( x<pI
dfc0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  dx->pTable->nCol
dfd0: 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b   );.    wIndex +
dfe0: 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c  = x<0 ? 1 : aCol
dff0: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
e000: 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  i]].szEst;.  }. 
e010: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20   pIdx->szIdxRow 
e020: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
e030: 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wIndex*4);.}../*
e040: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
e050: 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64  value x is found
e060: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
e070: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
e080: 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61  f aiCol[].*/.sta
e090: 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d  tic int hasColum
e0a0: 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43  n(const i16 *aiC
e0b0: 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e  ol, int nCol, in
e0c0: 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t x){.  while( n
e0d0: 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20  Col-- > 0 ) if( 
e0e0: 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20  x==*(aiCol++) ) 
e0f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
e100: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f  rn 0;.}../* Reco
e110: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74  mpute the colNot
e120: 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20 74  Idxed field of t
e130: 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  he Index..**.** 
e140: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61  colNotIdxed is a
e150: 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68 61   bitmask that ha
e160: 73 20 61 20 30 20 62 69 74 20 72 65 70 72 65 73  s a 0 bit repres
e170: 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64 65  enting each inde
e180: 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  xed.** columns t
e190: 68 61 74 20 61 72 65 20 77 69 74 68 69 6e 20 74  hat are within t
e1a0: 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75  he first 63 colu
e1b0: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
e1c0: 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f  .  The.** high-o
e1d0: 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e  rder bit of colN
e1e0: 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77 61 79  otIdxed is alway
e1f0: 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65  s 1.  All uninde
e200: 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  xed columns.** o
e210: 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 76 65  f the table have
e220: 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   a 1..**.** The 
e230: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b  colNotIdxed mask
e240: 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68 20   is AND-ed with 
e250: 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  the SrcList.a[].
e260: 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20  colUsed mask.** 
e270: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
e280: 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f 76  the index is cov
e290: 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a  ering index..*/.
e2a0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f  static void reco
e2b0: 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49  mputeColumnsNotI
e2c0: 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70 49  ndexed(Index *pI
e2d0: 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  dx){.  Bitmask m
e2e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
e2f0: 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f   for(j=pIdx->nCo
e300: 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  lumn-1; j>=0; j-
e310: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  -){.    int x = 
e320: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
e330: 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20  ];.    if( x>=0 
e340: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
e350: 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
e360: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
e370: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
e380: 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d   if( x<BMS-1 ) m
e390: 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a   |= MASKBIT(x);.
e3a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78      }.  }.  pIdx
e3b0: 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20  ->colNotIdxed = 
e3c0: 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ~m;.  assert( (p
e3d0: 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64  Idx->colNotIdxed
e3e0: 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f  >>63)==1 );.}../
e3f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e400: 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e  e runs at the en
e410: 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43  d of parsing a C
e420: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e430: 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61  ement that.** ha
e440: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
e450: 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a  D clause.  The j
e460: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
e470: 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74  ne is to convert
e480: 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61   both.** interna
e490: 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74  l schema data st
e4a0: 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65  ructures and the
e4b0: 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20   generated VDBE 
e4c0: 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65  code so that the
e4d0: 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72  y.** are appropr
e4e0: 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f  iate for a WITHO
e4f0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69  UT ROWID table i
e500: 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69  nstead of a rowi
e510: 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e  d table..** Chan
e520: 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ges include:.**.
e530: 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74 20  **     (1)  Set 
e540: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
e550: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73  he PRIMARY KEY s
e560: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20  chema object to 
e570: 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20  be NOT NULL..** 
e580: 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74      (2)  Convert
e590: 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f 66   P3 parameter of
e5a0: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74   the OP_CreateBt
e5b0: 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49  ree from BTREE_I
e5c0: 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20 20  NTKEY .**       
e5d0: 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c     into BTREE_BL
e5e0: 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33  OBKEY..**     (3
e5f0: 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63 72  )  Bypass the cr
e600: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  eation of the sq
e610: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e620: 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20  e entry.**      
e630: 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d      for the PRIM
e640: 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 70  ARY KEY as the p
e650: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
e660: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
e670: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
e680: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
e690: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
e6a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
e6b0: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20  elf..**     (4) 
e6c0: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
e6d0: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
e6e0: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
e6f0: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
e700: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
e710: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
e720: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
e730: 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41  e..**     (5)  A
e740: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
e750: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
e760: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
e770: 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ject.**         
e780: 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49   so that the PRI
e790: 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f  MARY KEY is a co
e7a0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54  vering index.  T
e7b0: 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20  he surplus.**   
e7c0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61         columns a
e7d0: 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e  re part of KeyIn
e7e0: 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64  fo.nAllField and
e7f0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f   are not used fo
e800: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  r.**          so
e810: 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20  rting or lookup 
e820: 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68  or uniqueness ch
e830: 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29  ecks..**     (6)
e840: 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f    Replace the ro
e850: 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20  wid tail on all 
e860: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
e870: 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a  nerated UNIQUE.*
e880: 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69 63  *          indic
e890: 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49 4d  es with the PRIM
e8a0: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e  ARY KEY columns.
e8b0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75  .**.** For virtu
e8c0: 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20  al tables, only 
e8d0: 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64  (1) is performed
e8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e8f0: 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
e900: 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73  tRowidTable(Pars
e910: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
e920: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
e930: 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20   *pIdx;.  Index 
e940: 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b  *pPk;.  int nPk;
e950: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
e960: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e970: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
e980: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
e990: 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65  be;..  /* Mark e
e9a0: 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b 45 59  very PRIMARY KEY
e9b0: 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e   column as NOT N
e9c0: 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f 72 20  ULL (except for 
e9d0: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 29  imposter tables)
e9e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
e9f0: 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
ea00: 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ble ){.    for(i
ea10: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
ea20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ea30: 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  ( (pTab->aCol[i]
ea40: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
ea50: 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20  LAG_PRIMKEY)!=0 
ea60: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
ea70: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
ea80: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
ea90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
eaa0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
eab0: 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74   P3 operand of t
eac0: 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  he OP_CreateBtre
ead0: 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54  e opcode from BT
eae0: 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20  REE_INTKEY.  ** 
eaf0: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
eb00: 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  EY..  */.  if( p
eb10: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
eb20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
eb30: 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v );.    sqlite3
eb40: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
eb50: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
eb60: 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  b, BTREE_BLOBKEY
eb70: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
eb80: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
eb90: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
eba0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
ebb0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
ebc0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
ebd0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
ebe0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
ebf0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
ec00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
ec10: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
ec20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
ec30: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
ec40: 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74  Token;.    sqlit
ec50: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b  e3TokenInit(&ipk
ec60: 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f  Token, pTab->aCo
ec70: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
ec80: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
ec90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
eca0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
ecb0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
ecc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ecd0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
ece0: 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29  D, &ipkToken, 0)
ecf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
ed00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
ed10: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
ed20: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65  rtOrder = pParse
ed30: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a  ->iPkSortOrder;.
ed40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
ed50: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70  se->pNewTable==p
ed60: 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Tab );.    sqlit
ed70: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
ed80: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
ed90: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43  List, pTab->keyC
eda0: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  onf, 0, 0, 0, 0,
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
edc0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
edd0: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
ede0: 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  Y);.    if( db->
edf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
ee00: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ee10: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d  eturn;.    pPk =
ee20: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
ee30: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
ee40: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
ee50: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
ee60: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
ee70: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
ee80: 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Tab);.    assert
ee90: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 0a 20 20 20  ( pPk!=0 );..   
eea0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76   /*.    ** Remov
eeb0: 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20  e all redundant 
eec0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
eed0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
eee0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e  or example, chan
eef0: 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41  ge.    ** "PRIMA
ef00: 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63  RY KEY(a,b,a,b,c
ef10: 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75  ,b,c,d)" into ju
ef20: 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28  st "PRIMARY KEY(
ef30: 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65  a,b,c,d)".  Late
ef40: 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73  r.    ** code as
ef50: 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52  sumes the PRIMAR
ef60: 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e  Y KEY contains n
ef70: 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d  o repeated colum
ef80: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ns..    */.    f
ef90: 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d  or(i=j=1; i<pPk-
efa0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
efb0: 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c        if( hasCol
efc0: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
efd0: 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  n, j, pPk->aiCol
efe0: 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  umn[i]) ){.     
eff0: 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d     pPk->nColumn-
f000: 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
f010: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
f020: 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b  olumn[j++] = pPk
f030: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
f040: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f050: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20   pPk->nKeyCol = 
f060: 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  j;.  }.  assert(
f070: 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b   pPk!=0 );.  pPk
f080: 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
f090: 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  ;.  if( !db->ini
f0a0: 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20  t.imposterTable 
f0b0: 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75  ) pPk->uniqNotNu
f0c0: 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20  ll = 1;.  nPk = 
f0d0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20  pPk->nKeyCol;.. 
f0e0: 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63   /* Bypass the c
f0f0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  reation of the P
f100: 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65  RIMARY KEY btree
f110: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
f120: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
f130: 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73  e entry. This is
f140: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
f150: 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65  f currently gene
f160: 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a  rating VDBE.  **
f170: 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41   code for a CREA
f180: 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68  TE TABLE (not wh
f190: 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61  en parsing one a
f1a0: 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e  s part of readin
f1b0: 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73  g.  ** a databas
f1c0: 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20  e schema).  */. 
f1d0: 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74   if( v && pPk->t
f1e0: 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  num>0 ){.    ass
f1f0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
f200: 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  sy==0 );.    sql
f210: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
f220: 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75  code(v, pPk->tnu
f230: 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d  m, OP_Goto);.  }
f240: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20  ..  /* The root 
f250: 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d  page of the PRIM
f260: 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74  ARY KEY is the t
f270: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a  able root page *
f280: 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20  /.  pPk->tnum = 
f290: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f  pTab->tnum;..  /
f2a0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d  * Update the in-
f2b0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
f2c0: 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49  ation of all UNI
f2d0: 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63  QUE indices by c
f2e0: 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74  onverting.  ** t
f2f0: 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63  he final rowid c
f300: 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f  olumn into one o
f310: 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
f320: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
f330: 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  Y..  */.  for(pI
f340: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f350: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f360: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
f370: 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50  t n;.    if( IsP
f380: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
f390: 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Idx) ) continue;
f3a0: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  .    for(i=n=0; 
f3b0: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
f3c0: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
f3d0: 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  n(pIdx->aiColumn
f3e0: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  , pIdx->nKeyCol,
f3f0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
f400: 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  ]) ) n++;.    }.
f410: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
f420: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e        /* This in
f430: 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65  dex is a superse
f440: 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  t of the primary
f450: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49   key */.      pI
f460: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49  dx->nColumn = pI
f470: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
f480: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
f490: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a   }.    if( resiz
f4a0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
f4b0: 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65   pIdx, pIdx->nKe
f4c0: 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e  yCol+n) ) return
f4d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
f4e0: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  =pIdx->nKeyCol; 
f4f0: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
f500: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
f510: 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  n(pIdx->aiColumn
f520: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  , pIdx->nKeyCol,
f530: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
f540: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ]) ){.        pI
f550: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
f560: 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
f570: 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  i];.        pIdx
f580: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50  ->azColl[j] = pP
f590: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  k->azColl[i];.  
f5a0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
f5b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
f5c0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
f5d0: 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn>=pIdx->nKeyCo
f5e0: 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l+n );.    asser
f5f0: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
f600: 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >=j );.  }..  /*
f610: 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63   Add all table c
f620: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52  olumns to the PR
f630: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a  IMARY KEY index.
f640: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70    */.  if( nPk<p
f650: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
f660: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78   if( resizeIndex
f670: 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20  Object(db, pPk, 
f680: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65  pTab->nCol) ) re
f690: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
f6a0: 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62  0, j=nPk; i<pTab
f6b0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
f6c0: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
f6d0: 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  mn(pPk->aiColumn
f6e0: 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  , j, i) ){.     
f6f0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b     assert( j<pPk
f700: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
f710: 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75       pPk->aiColu
f720: 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[j] = i;.     
f730: 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a     pPk->azColl[j
f740: 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
f750: 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b  NARY;.        j+
f760: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
f770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b  .    assert( pPk
f780: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a  ->nColumn==j );.
f790: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
f7a0: 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d  ->nCol==j );.  }
f7b0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e  else{.    pPk->n
f7c0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e  Column = pTab->n
f7d0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d  Col;.  }.  recom
f7e0: 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e  puteColumnsNotIn
f7f0: 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 23  dexed(pPk);.}..#
f800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f810: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
f820: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
f830: 65 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 61 20  e if zName is a 
f840: 73 68 61 64 6f 77 20 74 61 62 6c 65 20 6e 61 6d  shadow table nam
f850: 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
f860: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
f870: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 7a  nection..**.** z
f880: 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f 72 61 72  Name is temporar
f890: 69 6c 79 20 6d 6f 64 69 66 69 65 64 20 77 68 69  ily modified whi
f8a0: 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  le this routine 
f8b0: 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62 75 74 20  is running, but 
f8c0: 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65 64 20 74  is.** restored t
f8d0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 76  o its original v
f8e0: 61 6c 75 65 20 70 72 69 6f 72 20 74 6f 20 74 68  alue prior to th
f8f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
f900: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
f910: 69 6e 74 20 69 73 53 68 61 64 6f 77 54 61 62 6c  int isShadowTabl
f920: 65 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  eName(sqlite3 *d
f930: 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  b, char *zName){
f940: 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b 20  .  char *zTail; 
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
f970: 68 65 20 6c 61 73 74 20 22 5f 22 20 69 6e 20 7a  he last "_" in z
f980: 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  Name */.  Table 
f990: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
f9a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
f9b0: 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61   that zName is a
f9c0: 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f 0a 20 20   shadow of */.  
f9d0: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20 20  Module *pMod;   
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f9f0: 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74 68 65 20   Module for the 
fa00: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
fa10: 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73 74 72 72  ..  zTail = strr
fa20: 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f 27 29 3b  chr(zName, '_');
fa30: 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d 3d 30 20  .  if( zTail==0 
fa40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 7a  ) return 0;.  *z
fa50: 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  Tail = 0;.  pTab
fa60: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
fa70: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
fa80: 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 27 5f  );.  *zTail = '_
fa90: 27 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ';.  if( pTab==0
faa0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
fab0: 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
fac0: 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
fad0: 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65    pMod = (Module
fae0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
faf0: 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20  d(&db->aModule, 
fb00: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
fb10: 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 4d 6f  g[0]);.  if( pMo
fb20: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  d==0 ) return 0;
fb30: 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f  .  if( pMod->pMo
fb40: 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 3c 33  dule->iVersion<3
fb50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
fb60: 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65  f( pMod->pModule
fb70: 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 3d 3d 30  ->xShadowName==0
fb80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
fb90: 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f 64  eturn pMod->pMod
fba0: 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65  ule->xShadowName
fbb0: 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65 6c  (zTail+1);.}.#el
fbc0: 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73 53 68  se.# define isSh
fbd0: 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 78 2c  adowTableName(x,
fbe0: 79 29 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 69  y) 0.#endif /* i
fbf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc00: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
fc10: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
fc20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
fc30: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
fc40: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
fc50: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
fc60: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
fc70: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
fc80: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
fc90: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
fca0: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
fcb0: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
fcc0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
fcd0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
fce0: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
fcf0: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
fd00: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
fd10: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
fd20: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
fd30: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
fd40: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
fd50: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
fd60: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fd70: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
fd80: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
fd90: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
fda0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
fdb0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
fdc0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
fdd0: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
fde0: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
fdf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
fe00: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
fe10: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
fe20: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
fe30: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
fe40: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
fe50: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
fe60: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
fe70: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
fe80: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
fe90: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
fea0: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
feb0: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
fec0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
fed0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
fee0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
fef0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
ff00: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
ff10: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
ff20: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
ff30: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
ff40: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
ff50: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ff60: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
ff70: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
ff80: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
ff90: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
ffa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
ffb0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
ffc0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ffd0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
ffe0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
fff0: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
10000 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
10010 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
10020 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
10030 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
10040 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
10050 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e  )' before option
10060 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  s in the CREATE 
10070 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61  TABLE */.  u8 ta
10080 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20 20  bOpts,          
10090 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c     /* Extra tabl
100a0 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c  e options. Usual
100b0 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  ly 0. */.  Selec
100c0 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
100d0 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
100e0 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
100f0 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
10100 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20  .  Table *p;    
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10120 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  The new table */
10130 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
10140 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
10150 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
10160 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
10170 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
10180 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10190 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  se in which the 
101a0 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20  table lives */. 
101b0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
101c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
101d0 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f   implied index o
101e0 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  f the table */..
101f0 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26    if( pEnd==0 &&
10200 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20   pSelect==0 ){. 
10210 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10220 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
10230 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
10240 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
10250 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
10260 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  0 ) return;..  i
10270 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 26 26  f( pSelect==0 &&
10280 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61   isShadowTableNa
10290 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29  me(db, p->zName)
102a0 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c   ){.    p->tabFl
102b0 61 67 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77  ags |= TF_Shadow
102c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
102d0 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
102e0 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
102f0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
10300 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
10310 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
10320 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
10330 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
10340 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
10350 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
10360 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
10370 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
10380 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
10390 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
103a0 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
103b0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
103c0 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
103d0 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
103e0 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
103f0 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
10400 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
10410 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a  utine.).  **.  *
10420 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * If the root pa
10430 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c 20  ge number is 1, 
10440 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20  that means this 
10450 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  is the sqlite_ma
10460 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
10470 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b  itself.  So mark
10480 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20   it read-only.. 
10490 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
104a0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
104b0 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
104c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
104d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22 29 3b  Msg(pParse, "");
104e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
104f0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d     }.    p->tnum
10500 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
10510 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  num;.    if( p->
10520 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62  tnum==1 ) p->tab
10530 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64  Flags |= TF_Read
10540 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  only;.  }..  /* 
10550 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
10560 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
10570 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
10580 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
10590 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
105a0 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
105b0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
105c0 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
105d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
105e0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
105f0 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
10600 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
10610 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
10620 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
10630 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
10640 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
10650 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
10660 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
10670 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10680 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
10690 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
106a0 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
106b0 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
106c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
106d0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
106e0 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f  thoutRowid | TF_
106f0 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
10700 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57        convertToW
10710 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
10720 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
10730 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20   }.  }..  iDb = 
10740 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
10750 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
10760 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
10770 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
10780 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61  .  /* Resolve na
10790 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b  mes in all CHECK
107a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72   constraint expr
107b0 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
107c0 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b  if( p->pCheck ){
107d0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
107e0 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
107f0 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49  (pParse, p, NC_I
10800 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43  sCheck, 0, p->pC
10810 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  heck);.  }.#endi
10820 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10830 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
10840 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   */..  /* Estima
10850 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72  te the average r
10860 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20  ow size for the 
10870 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c  table and for al
10880 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65  l implied indice
10890 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54  s */.  estimateT
108a0 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20  ableWidth(p);.  
108b0 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
108c0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
108d0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
108e0 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
108f0 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a  dth(pIdx);.  }..
10900 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
10910 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
10920 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
10930 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
10940 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
10950 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
10960 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10970 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
10980 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
10990 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
109a0 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
109b0 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
109c0 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
109d0 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
109e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
109f0 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
10a00 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
10a10 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
10a20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
10a30 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
10a40 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
10a50 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
10a60 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
10a70 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
10a80 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
10a90 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
10aa0 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
10ab0 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
10ac0 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
10ad0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10ae0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
10af0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
10b00 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
10b10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10b20 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
10b30 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
10b40 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
10b50 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
10b60 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
10b70 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
10b80 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
10b90 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
10ba0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
10bb0 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
10bc0 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
10bd0 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
10be0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
10bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10c00 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
10c10 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
10c20 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
10c30 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
10c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10c50 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
10c60 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
10c70 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
10c80 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
10c90 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
10ca0 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
10cb0 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
10cc0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
10cd0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
10ce0 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
10cf0 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
10d00 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
10d10 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
10d20 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
10d30 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
10d40 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
10d50 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
10d60 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
10d70 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
10d80 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
10d90 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
10da0 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
10db0 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
10dc0 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
10dd0 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
10de0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
10df0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
10e00 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
10e10 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
10e20 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
10e30 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
10e40 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
10e50 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
10e60 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
10e70 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
10e80 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
10e90 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
10ea0 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
10eb0 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
10ec0 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
10ed0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
10ee0 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68  t dest;    /* Wh
10ef0 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ere the SELECT s
10f00 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75  hould store resu
10f10 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  lts */.      int
10f20 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20   regYield;      
10f30 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
10f40 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20  ding co-routine 
10f50 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20  entry-point */. 
10f60 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
10f70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  ;        /* Top 
10f80 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
10f90 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
10fa0 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  egRec;         /
10fb0 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65  * A record to be
10fc0 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65   insert into the
10fd0 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
10fe0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
10ff0 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
11000 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77   of the next row
11010 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
11020 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c      int addrInsL
11030 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f  oop;    /* Top o
11040 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69  f the loop for i
11050 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f  nserting rows */
11060 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
11070 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20  elTab;     /* A 
11080 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72  table that descr
11090 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  ibes the SELECT 
110a0 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20  results */..    
110b0 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70    regYield = ++p
110c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
110d0 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50     regRec = ++pP
110e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
110f0 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
11100 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
11110 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
11120 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
11130 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
11140 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
11150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11160 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
11170 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
11180 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
11190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
111a0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
111b0 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20  G_P2ISREG);.    
111c0 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
111d0 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f   2;.      addrTo
111e0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
111f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
11200 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
11210 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11220 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
11230 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64  regYield, 0, add
11240 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  rTop);.      if(
11250 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
11260 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53  return;.      pS
11270 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
11280 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
11290 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
112a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
112b0 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
112c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
112d0 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
112e0 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
112f0 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
11300 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
11310 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
11320 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
11330 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
11340 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
11350 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
11360 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
11370 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ab);.      sqlit
11380 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11390 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
113a0 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
113b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
113c0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
113d0 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20  elect, &dest);. 
113e0 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
113f0 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
11400 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11410 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
11420 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
11430 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11440 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
11450 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64   - 1);.      add
11460 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  rInsLoop = sqlit
11470 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11480 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69  OP_Yield, dest.i
11490 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56  SDParm);.      V
114a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
114b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
114d0 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69  keRecord, dest.i
114e0 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74  Sdst, dest.nSdst
114f0 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20  , regRec);.     
11500 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66   sqlite3TableAff
11510 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a  inity(v, p, 0);.
11520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
11540 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f  wRowid, 1, regRo
11550 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
11560 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11570 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72   OP_Insert, 1, r
11580 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29  egRec, regRowid)
11590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
115a0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49  dbeGoto(v, addrI
115b0 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  nsLoop);.      s
115c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
115d0 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  re(v, addrInsLoo
115e0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
115f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11600 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20  P_Close, 1);.   
11610 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
11620 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
11630 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
11640 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
11650 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
11660 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
11670 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
11680 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
11690 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
116a0 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
116b0 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
116c0 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
116d0 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
116e0 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
116f0 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
11700 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
11710 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
11720 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
11730 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
11740 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
11750 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
11760 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
11770 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
11780 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
11790 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
117a0 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
117b0 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
117c0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
117d0 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
117e0 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
117f0 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
11800 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
11810 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
11820 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
11830 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
11840 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
11850 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
11860 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
11870 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
11880 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
11890 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
118a0 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
118b0 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
118c0 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
118d0 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
118e0 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
118f0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
11900 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
11910 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
11920 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
11930 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
11940 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
11950 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
11960 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
11970 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
11980 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11990 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
119a0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
119b0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
119c0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
119d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
119e0 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
119f0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
11a00 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
11a10 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
11a20 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
11a30 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
11a40 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
11a50 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
11a60 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
11a70 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
11a80 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20  rement)!=0 ){.  
11a90 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
11aa0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
11ab0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11ac0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
11ad0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
11ae0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
11af0 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
11b00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
11b10 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
11b20 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
11b30 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
11b40 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
11b50 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
11b60 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
11b70 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20  zDbSName.       
11b80 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
11b90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
11ba0 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
11bb0 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
11bc0 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
11bd0 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
11be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11bf0 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50  ParseSchemaOp(pP
11c00 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20 20 20  arse, iDb,.     
11c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
11c20 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61  intf(db, "tbl_na
11c30 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
11c40 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d  !='trigger'", p-
11c50 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a  >zName));.  }...
11c60 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
11c70 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
11c80 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
11c90 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
11ca0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
11cb0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
11cc0 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
11cd0 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
11ce0 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
11cf0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  a;.    assert( s
11d00 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
11d10 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
11d20 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ) );.    pOld = 
11d30 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11d40 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
11d50 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  ash, p->zName, p
11d60 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
11d70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11d80 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
11d90 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
11da0 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
11db0 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
11dc0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
11dd0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
11de0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
11df0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
11e00 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
11e10 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
11e20 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
11e30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
11e40 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
11e50 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
11e60 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
11e70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
11e80 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
11e90 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
11ea0 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
11eb0 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
11ec0 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
11ed0 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
11ee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
11ef0 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
11f00 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
11f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11f20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
11f30 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
11f40 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
11f50 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
11f60 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
11f70 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
11f80 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
11f90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
11fa0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11fb0 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
11fc0 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
11fd0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
11fe0 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
11ff0 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
12000 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
12010 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
12020 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
12030 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
12040 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
12050 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
12060 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
12070 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
12080 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
12090 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
120a0 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
120b0 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
120c0 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
120d0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
120e0 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
120f0 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
12100 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
12110 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  iew */.  ExprLis
12120 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f  t *pCNames, /* O
12130 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20  ptional list of 
12140 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  view column name
12150 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
12160 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
12170 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12180 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
12190 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
121a0 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
121b0 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
121c0 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
121d0 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
121e0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
121f0 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
12200 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
12210 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
12220 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
12230 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
12240 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e  char *z;.  Token
12250 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72   sEnd;.  DbFixer
12260 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a   sFix;.  Token *
12270 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pName = 0;.  int
12280 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
12290 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
122a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
122b0 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
122c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
122d0 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
122e0 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
122f0 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
12300 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76     goto create_v
12310 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20  iew_fail;.  }.  
12320 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
12330 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
12340 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
12350 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
12360 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
12370 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
12380 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
12390 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74  Err ) goto creat
123a0 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73  e_view_fail;.  s
123b0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
123c0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
123d0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
123e0 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
123f0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12400 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
12410 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
12420 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
12430 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
12440 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
12450 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
12460 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67  ix, pSelect) ) g
12470 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
12480 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  fail;..  /* Make
12490 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
124a0 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
124b0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
124c0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
124d0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
124e0 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
124f0 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
12500 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
12510 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
12520 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
12530 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
12540 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
12550 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
12560 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
12570 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
12580 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
12590 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
125a0 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e   */.  if( IN_REN
125b0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
125c0 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70    p->pSelect = p
125d0 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c  Select;.    pSel
125e0 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ect = 0;.  }else
125f0 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74  {.    p->pSelect
12600 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12610 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
12620 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
12630 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65 63  ;.  }.  p->pChec
12640 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
12650 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61 6d  istDup(db, pCNam
12660 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  es, EXPRDUP_REDU
12670 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  CE);.  if( db->m
12680 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
12690 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
126a0 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  ail;..  /* Locat
126b0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
126c0 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
126d0 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
126e0 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
126f0 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
12700 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
12710 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73  sLastToken;.  as
12720 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21  sert( sEnd.z[0]!
12730 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20  =0 || sEnd.n==0 
12740 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  );.  if( sEnd.z[
12750 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
12760 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
12770 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
12780 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
12790 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
127a0 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  z);.  assert( n>
127b0 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  0 );.  z = pBegi
127c0 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73  n->z;.  while( s
127d0 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
127e0 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
127f0 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
12800 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
12810 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
12820 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
12830 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
12840 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
12850 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
12860 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
12870 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
12880 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76  0, 0);..create_v
12890 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69  iew_fail:.  sqli
128a0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
128b0 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
128c0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
128d0 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  JECT ){.    sqli
128e0 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c 69 73  te3RenameExprlis
128f0 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70  tUnmap(pParse, p
12900 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20 73  CNames);.  }.  s
12910 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
12920 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73  lete(db, pCNames
12930 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
12940 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12950 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
12960 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
12970 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
12980 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12990 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
129a0 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
129b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
129c0 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
129d0 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
129e0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
129f0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
12a00 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
12a10 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
12a20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12a30 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
12a40 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
12a50 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
12a60 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
12a70 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
12a80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12a90 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
12aa0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
12ab0 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
12ac0 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
12ad0 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
12ae0 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
12af0 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
12b00 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
12b10 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
12b20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
12b30 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
12b40 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
12b50 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
12b60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12b70 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
12b80 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
12b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
12ba0 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
12bb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
12bc0 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
12bd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12be0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
12bf0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
12c00 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
12c10 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65  errors */.#ifnde
12c20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12c30 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
12c40 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e   rc;.#endif.#ifn
12c50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12c60 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
12c70 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41  sqlite3_xauth xA
12c80 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  uth;       /* Sa
12c90 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65  ved xAuth pointe
12ca0 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  r */.#endif..  a
12cb0 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
12cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12cd0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12ce0 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61  LE.  db->nSchema
12cf0 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20 73  Lock++;.  rc = s
12d00 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
12d10 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
12d20 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53 63  able);.  db->nSc
12d30 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66  hemaLock--;.  if
12d40 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
12d50 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
12d60 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
12d70 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
12d80 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
12d90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
12da0 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
12db0 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
12dc0 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
12dd0 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
12de0 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
12df0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
12e00 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
12e10 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
12e20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
12e30 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
12e40 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
12e50 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
12e60 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
12e70 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
12e80 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
12e90 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
12ea0 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
12eb0 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
12ec0 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
12ed0 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
12ee0 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
12ef0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
12f00 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
12f10 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
12f20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
12f30 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
12f40 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
12f50 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
12f60 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
12f70 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
12f80 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
12f90 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
12fa0 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
12fb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
12fc0 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
12fd0 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
12fe0 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
12ff0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
13000 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
13010 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
13020 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
13030 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
13040 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
13050 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
13060 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
13070 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
13080 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
13090 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
130a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
130b0 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
130c0 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
130d0 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
130e0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
130f0 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
13100 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
13110 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
13120 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
13130 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
13140 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
13150 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
13160 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
13170 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
13180 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
13190 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
131a0 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
131b0 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
131c0 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
131d0 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
131e0 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
131f0 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
13200 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
13210 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
13220 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
13230 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
13240 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
13250 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
13260 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
13270 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
13280 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
13290 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
132a0 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
132b0 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
132c0 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
132d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
132e0 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
132f0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
13300 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66 20  pSel ){.#ifndef 
13310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
13320 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20 65 50  RTABLE.    u8 eP
13330 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61 72 73  arseMode = pPars
13340 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a 20  e->eParseMode;. 
13350 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73     pParse->ePars
13360 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f  eMode = PARSE_MO
13370 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69  DE_NORMAL;.#endi
13380 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65  f.    n = pParse
13390 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69  ->nTab;.    sqli
133a0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
133b0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
133c0 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20  pSel->pSrc);.   
133d0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
133e0 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  -1;.    db->look
133f0 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b  aside.bDisable++
13400 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13410 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
13420 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20  ION.    xAuth = 
13430 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64  db->xAuth;.    d
13440 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->xAuth = 0;.  
13450 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
13460 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
13470 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
13480 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  l);.    db->xAut
13490 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65  h = xAuth;.#else
134a0 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
134b0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
134c0 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
134d0 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  pSel);.#endif.  
134e0 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
134f0 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   n;.    if( pTab
13500 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20  le->pCheck ){.  
13510 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49      /* CREATE VI
13520 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29  EW name(arglist)
13530 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a   AS ....      **
13540 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   The names of th
13550 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
13560 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e   table are taken
13570 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61   from.      ** a
13580 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73 20  rglist which is 
13590 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65  stored in pTable
135a0 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70  ->pCheck.  The p
135b0 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20  Check field.    
135c0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f    ** normally ho
135d0 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  lds CHECK constr
135e0 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69  aints on an ordi
135f0 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20  nary table, but 
13600 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56  for.      ** a V
13610 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65  IEW it holds the
13620 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   list of column 
13630 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  names..      */.
13640 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
13650 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
13660 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d  (pParse, pTable-
13670 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20  >pCheck, .      
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62             &pTab
136a0 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c  le->nCol, &pTabl
136b0 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e->aCol);.      
136c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
136d0 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  iled==0 .       
136e0 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
136f0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  =0.       && pTa
13700 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d  ble->nCol==pSel-
13710 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20  >pEList->nExpr. 
13720 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
13730 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
13740 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
13750 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
13760 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Table, pSel);.  
13770 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13780 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
13790 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
137a0 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20  IEW name AS...  
137b0 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d  without an argum
137c0 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74  ent list.  Const
137d0 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  ruct.      ** th
137e0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
137f0 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73  rom the SELECT s
13800 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
13810 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
13820 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
13830 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
13840 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
13850 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
13860 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
13870 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
13880 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
13890 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
138a0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
138b0 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
138c0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
138d0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
138e0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
138f0 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
13900 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
13910 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
13920 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
13930 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
13940 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
13950 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
13960 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
13970 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
13980 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  );.    db->looka
13990 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b  side.bDisable--;
139a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
139b0 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
139c0 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72      pParse->ePar
139d0 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73 65 4d  seMode = eParseM
139e0 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 20  ode;.#endif.  } 
139f0 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
13a00 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  +;.  }.  pTable-
13a10 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  >pSchema->schema
13a20 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  Flags |= DB_Unre
13a30 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66 28 20  setViews;.  if( 
13a40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13a50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
13a60 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
13a70 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
13a80 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
13a90 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   0;.    pTable->
13aa0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  nCol = 0;.  }.#e
13ab0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
13ac0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
13ad0 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
13ae0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
13af0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13b00 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
13b10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13b20 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
13b30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13b40 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
13b50 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
13b60 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
13b70 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
13b80 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
13b90 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
13ba0 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
13bb0 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
13bc0 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61  HashElem *i;.  a
13bd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
13be0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
13bf0 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69  , idx, 0) );.  i
13c00 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
13c10 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
13c20 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
13c30 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
13c40 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
13c50 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
13c60 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
13c70 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
13c80 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
13c90 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
13ca0 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
13cb0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
13cc0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
13cd0 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
13ce0 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  mes(db, pTab);. 
13cf0 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20       pTab->aCol 
13d00 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 0;.      pTab-
13d10 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  >nCol = 0;.    }
13d20 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
13d30 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
13d40 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
13d50 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
13d60 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
13d70 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
13d80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13d90 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
13da0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13db0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
13dc0 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
13dd0 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
13de0 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
13df0 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
13e00 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
13e10 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
13e20 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
13e30 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
13e40 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
13e50 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
13e60 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
13e70 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54   to iTo..**.** T
13e80 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68  icket #1728:  Th
13e90 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d  e symbol table m
13ea0 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  ight still conta
13eb0 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  in information.*
13ec0 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f  * on tables and/
13ed0 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  or indices that 
13ee0 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  are the process 
13ef0 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  of being deleted
13f00 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20  ..** If you are 
13f10 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20  unlucky, one of 
13f20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e  those deleted in
13f30 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20  dices or tables 
13f40 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68  might.** have th
13f50 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20  e same rootpage 
13f60 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65  number as the re
13f70 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  al table or inde
13f80 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69  x that is.** bei
13f90 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65  ng moved.  So we
13fa0 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61   cannot stop sea
13fb0 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65  rching after the
13fc0 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a   first match .**
13fd0 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72   because the fir
13fe0 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62  st match might b
13ff0 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
14000 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
14010 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e  .** or tables an
14020 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f  d not the table/
14030 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63  index that is ac
14040 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76  tually being mov
14050 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63  ed..** We must c
14060 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20  ontinue looping 
14070 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73  until all tables
14080 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74   and indices wit
14090 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69  h.** rootpage==i
140a0 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63  From have been c
140b0 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65  onverted to have
140c0 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69   a rootpage of i
140d0 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  To.** in order t
140e0 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61  o be certain tha
140f0 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67  t we got the rig
14100 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ht one..*/.#ifnd
14110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14120 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
14130 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
14140 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ved(sqlite3 *db,
14150 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46   int iDb, int iF
14160 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
14170 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
14180 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
14190 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
141a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
141b0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
141c0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70  , iDb, 0) );.  p
141d0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
141e0 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70  b];.  pHash = &p
141f0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
14200 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
14210 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
14220 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
14230 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
14240 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
14250 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
14260 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
14270 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
14280 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
14290 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
142a0 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
142b0 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
142c0 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
142d0 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
142e0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
142f0 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
14300 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
14310 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
14320 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
14330 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
14340 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
14350 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
14360 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
14370 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
14380 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
14390 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
143a0 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
143b0 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
143c0 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
143d0 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
143e0 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
143f0 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
14400 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
14410 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
14420 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
14430 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
14440 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
14450 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
14460 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
14470 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
14480 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
14490 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
144a0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
144b0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
144c0 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
144d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
144e0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
144f0 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
14500 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14510 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
14520 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
14530 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14540 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 32 20  .  if( iTable<2 
14550 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73  ) sqlite3ErrorMs
14560 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
14570 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20 20 73  pt schema");.  s
14580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14590 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
145a0 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29  iTable, r1, iDb)
145b0 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62  ;.  sqlite3MayAb
145c0 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66  ort(pParse);.#if
145d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
145e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
145f0 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72   OP_Destroy stor
14600 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72  es an in integer
14610 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74   r1. If this int
14620 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e  eger.  ** is non
14630 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
14640 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
14650 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c  number of a tabl
14660 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  e moved to.  ** 
14670 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e  location iTable.
14680 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14690 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ode modifies the
146a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
146b0 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
146c0 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
146d0 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20    ** The "#NNN" 
146e0 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  in the SQL is a 
146f0 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74  special constant
14700 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74   that means what
14710 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ever value.  ** 
14720 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e  is in register N
14730 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72  NN.  See grammar
14740 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65   rules associate
14750 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45  d with the TK_RE
14760 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65  GISTER.  ** toke
14770 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
14780 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
14790 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
147a0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
147b0 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51  .     "UPDATE %Q
147c0 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65  .%s SET rootpage
147d0 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41 4e  =%d WHERE #%d AN
147e0 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c  D rootpage=#%d",
147f0 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  .     pParse->db
14800 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
14810 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
14820 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
14830 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
14840 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14850 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
14860 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
14870 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
14880 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
14890 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
148a0 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
148b0 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
148c0 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
148d0 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
148e0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
148f0 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
14900 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
14910 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
14920 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
14930 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
14940 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
14950 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
14960 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
14970 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
14980 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
14990 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
149a0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
149b0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
149c0 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ){.  /* If the d
149d0 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
149e0 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
149f0 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
14a00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14a10 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
14a20 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
14a30 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
14a40 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
14a50 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
14a60 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
14a70 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
14a80 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
14a90 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
14aa0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
14ab0 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
14ac0 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
14ad0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
14ae0 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
14af0 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
14b00 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
14b10 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
14b20 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
14b30 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
14b40 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
14b50 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
14b60 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
14b70 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
14b80 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
14b90 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
14ba0 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
14bb0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
14bc0 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
14bd0 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
14be0 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
14bf0 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
14c00 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
14c10 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
14c20 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
14c30 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
14c40 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
14c50 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
14c60 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
14c70 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
14c80 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
14c90 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
14ca0 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
14cb0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
14cc0 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
14cd0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
14ce0 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
14cf0 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
14d00 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
14d10 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
14d20 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
14d30 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
14d40 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
14d50 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
14d60 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
14d70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14d80 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
14d90 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
14da0 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
14db0 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
14dc0 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
14dd0 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
14de0 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
14df0 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
14e00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14e10 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
14e20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
14e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e40 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
14e50 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
14e60 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
14e70 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
14e80 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
14e90 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64  && iDb<pParse->d
14ea0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20  b->nDb );.      
14eb0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
14ec0 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
14ed0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
14ee0 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
14ef0 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  est;.    }.  }.}
14f00 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65  ../*.** Remove e
14f10 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
14f20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62  sqlite_statN tab
14f30 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31  les (for N in (1
14f40 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20  ,2,3)).** after 
14f50 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20  a DROP INDEX or 
14f60 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
14f70 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nd..*/.static vo
14f80 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53  id sqlite3ClearS
14f90 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72  tatTables(.  Par
14fa0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14fb0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
14fc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14fd0 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
14fe0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
14ff0 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
15000 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15010 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64  Type,     /* "id
15020 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20  x" or "tbl" */. 
15030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15040 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me      /* Name 
15050 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  of index or tabl
15060 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
15070 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15080 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d  DbName = pParse-
15090 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
150a0 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d  bSName;.  for(i=
150b0 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20  1; i<=4; i++){. 
150c0 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d     char zTab[24]
150d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
150e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
150f0 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65  ab),zTab,"sqlite
15100 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20  _stat%d",i);.   
15110 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
15120 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
15130 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29  , zTab, zDbName)
15140 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15150 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
15160 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
15170 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
15180 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20  WHERE %s=%Q",.  
15190 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a        zDbName, z
151a0 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d  Tab, zType, zNam
151b0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
151c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
151d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
151e0 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rop a table..*/.
151f0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
15200 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
15210 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
15220 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69  pTab, int iDb, i
15230 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64  nt isView){.  Vd
15240 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
15250 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15260 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  b;.  Trigger *pT
15270 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44  rigger;.  Db *pD
15280 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
15290 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  ];..  v = sqlite
152a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
152b0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
152c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
152d0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
152e0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
152f0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
15300 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15310 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
15320 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15340 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
15350 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
15360 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
15370 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
15380 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
15390 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
153a0 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  de.  ** is gener
153b0 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
153c0 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
153d0 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
153e0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d  .  ** sqlite_tem
153f0 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
15400 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72  ired..  */.  pTr
15410 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
15420 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
15430 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c  e, pTab);.  whil
15440 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
15450 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
15460 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
15470 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
15480 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
15490 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
154a0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
154b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70  .    sqlite3Drop
154c0 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
154d0 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20  e, pTrigger);.  
154e0 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
154f0 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
15500 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15510 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
15520 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  MENT.  /* Remove
15530 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
15540 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
15550 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
15560 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  ated with.  ** t
15570 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
15580 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20  ropped. This is 
15590 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
155a0 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
155b0 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72  .  ** at the btr
155c0 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73  ee level, in cas
155d0 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
155e0 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64  uence table need
155f0 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61  s to.  ** move a
15600 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
15610 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
15620 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
15630 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20  m mode)..  */.  
15640 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
15650 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
15660 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
15670 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
15680 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44  pParse,.      "D
15690 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
156a0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
156b0 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
156c0 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
156d0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
156e0 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66     );.  }.#endif
156f0 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
15700 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
15710 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
15720 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
15730 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   to the.  ** tab
15740 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
15750 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
15760 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
15770 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
15780 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
15790 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
157a0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
157b0 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
157c0 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f  e being.  ** dro
157d0 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
157e0 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
157f0 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
15800 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
15810 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
15820 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
15830 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
15840 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
15850 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  er.  ** database
15860 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15870 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
15880 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45  se, .      "DELE
15890 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
158a0 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
158b0 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
158c0 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  er'",.      pDb-
158d0 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  >zDbSName, MASTE
158e0 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e  R_NAME, pTab->zN
158f0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56  ame);.  if( !isV
15900 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
15910 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64  l(pTab) ){.    d
15920 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
15930 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a  se, pTab);.  }..
15940 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
15950 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
15960 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
15970 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
15980 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
15990 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a  hema cookie..  *
159a0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
159b0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
159c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
159d0 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
159e0 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
159f0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
15a00 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
15a10 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
15a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a30 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
15a40 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
15a50 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
15a60 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
15a70 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
15a80 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52  );.  sqliteViewR
15a90 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
15aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15ab0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15ac0 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
15ad0 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
15ae0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
15af0 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
15b00 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
15b10 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
15b20 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
15b30 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
15b40 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
15b50 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
15b60 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
15b70 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
15b80 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
15b90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15ba0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
15bb0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
15bc0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
15bd0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
15be0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
15bf0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
15c00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
15c10 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
15c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
15c30 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
15c40 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
15c50 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f  _table;.  if( no
15c60 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
15c70 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72  ssErr++;.  asser
15c80 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20  t( isView==0 || 
15c90 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56  isView==LOCATE_V
15ca0 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  IEW );.  pTab = 
15cb0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
15cc0 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69  leItem(pParse, i
15cd0 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61  sView, &pName->a
15ce0 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  [0]);.  if( noEr
15cf0 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
15d00 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54  Err--;..  if( pT
15d10 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
15d20 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33   noErr ) sqlite3
15d30 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
15d40 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
15d50 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
15d60 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ase);.    goto e
15d70 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15d80 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
15d90 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
15da0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
15db0 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
15dc0 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
15dd0 3e 6e 44 62 20 29 3b 0a 20 20 73 71 6c 69 74 65  >nDb );.  sqlite
15de0 33 53 63 68 65 6d 61 57 72 69 74 61 62 6c 65 28  3SchemaWritable(
15df0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 20  pParse, iDb);.. 
15e00 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
15e10 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
15e20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
15e30 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
15e40 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
15e50 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
15e60 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
15e70 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
15e80 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
15e90 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
15ea0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
15eb0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15ec0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15ed0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
15ee0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
15ef0 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
15f00 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
15f10 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
15f20 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
15f30 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
15f40 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
15f50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
15f60 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
15f70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
15f80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
15f90 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
15fa0 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
15fb0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15fc0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
15fd0 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
15fe0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
15ff0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
16000 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
16010 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
16020 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
16030 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
16040 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
16050 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
16060 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16070 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
16080 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
16090 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
160a0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
160b0 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
160c0 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71        zArg2 = sq
160d0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
160e0 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e  b, pTab)->pMod->
160f0 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
16100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
16110 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
16120 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
16130 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
16140 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
16150 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
16160 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
16170 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
16180 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
16190 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
161a0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
161b0 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
161c0 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
161d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
161e0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
161f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
16200 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
16210 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
16220 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
16230 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
16240 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16250 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
16260 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
16270 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
16280 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
16290 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
162a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
162b0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
162c0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  me, "sqlite_stat
162d0 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20  ", 11)!=0 ){.   
162e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
162f0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
16300 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
16310 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
16320 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
16330 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
16340 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16350 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
16360 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
16370 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
16380 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
16390 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
163a0 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
163b0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
163c0 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
163d0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
163e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
163f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
16400 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
16410 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
16420 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
16430 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16440 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
16450 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
16460 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
16470 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16480 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
16490 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
164a0 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
164b0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
164c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
164d0 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
164e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
164f0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
16500 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
16510 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
16520 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
16530 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
16540 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16550 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
16560 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16570 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
16580 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  , 1, iDb);.    i
16590 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
165a0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
165b0 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
165c0 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70  e, iDb, "tbl", p
165d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
165e0 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70     sqlite3FkDrop
165f0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
16600 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  ame, pTab);.    
16610 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
16620 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  eDropTable(pPars
16630 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73  e, pTab, iDb, is
16640 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  View);.  }..exit
16650 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
16660 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
16670 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
16680 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16690 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
166a0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
166b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
166c0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
166d0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
166e0 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
166f0 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
16700 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
16710 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
16720 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
16730 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
16740 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
16750 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
16760 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
16770 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
16780 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
16790 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
167a0 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
167b0 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72   (a.k.a the "par
167c0 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54  ent" table).  pT
167d0 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a  oCol is a list.*
167e0 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  * of tables in t
167f0 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61  he parent pTo ta
16800 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74  ble.  flags cont
16810 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
16820 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
16830 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
16840 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
16850 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
16860 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
16870 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
16880 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
16890 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
168a0 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
168b0 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
168c0 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
168d0 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
168e0 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
168f0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
16900 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
16910 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
16920 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
16930 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
16940 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
16950 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
16960 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
16970 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
16980 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
16990 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
169a0 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
169b0 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
169c0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
169d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
169e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
169f0 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
16a00 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
16a10 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
16a20 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
16a30 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
16a40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16a50 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
16a60 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
16a70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
16a80 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
16a90 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
16aa0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
16ab0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
16ac0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
16ad0 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
16ae0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
16af0 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
16b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
16b10 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
16b20 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
16b30 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
16b40 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
16b50 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
16b60 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
16b70 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
16b80 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
16b90 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
16ba0 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
16bb0 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
16bc0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
16bd0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
16be0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
16bf0 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
16c00 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
16c10 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
16c20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
16c30 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
16c40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16c50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16c60 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
16c70 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
16c80 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
16c90 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
16ca0 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
16cb0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
16cc0 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
16cd0 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
16ce0 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
16cf0 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
16d00 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
16d10 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
16d20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
16d30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16d40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
16d50 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
16d60 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
16d70 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
16d80 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
16d90 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
16da0 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
16db0 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
16dc0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
16dd0 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
16de0 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
16df0 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
16e00 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
16e10 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
16e20 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
16e30 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
16e40 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
16e50 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
16e60 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
16e70 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
16e80 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
16e90 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
16ea0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
16eb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
16ec0 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
16ed0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
16ee0 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
16ef0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
16f00 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
16f10 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
16f20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
16f30 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
16f40 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
16f50 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
16f60 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
16f70 3d 20 7a 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  = z;.  if( IN_RE
16f80 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
16f90 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
16fa0 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
16fb0 20 28 76 6f 69 64 2a 29 7a 2c 20 70 54 6f 29 3b   (void*)z, pTo);
16fc0 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  .  }.  memcpy(z,
16fd0 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
16fe0 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
16ff0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
17000 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
17010 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
17020 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
17030 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
17040 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
17050 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
17060 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
17070 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
17080 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
17090 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
170a0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
170b0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
170c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
170d0 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
170e0 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
170f0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
17100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
17110 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
17120 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
17130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17140 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
17150 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
17160 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17170 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17180 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
17190 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
171a0 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
171b0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
171c0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
171d0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
171e0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
171f0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
17200 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e        if( IN_REN
17210 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
17220 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
17230 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
17240 61 72 73 65 2c 20 26 70 46 4b 65 79 2d 3e 61 43  arse, &pFKey->aC
17250 6f 6c 5b 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d  ol[i], pFromCol-
17260 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
17270 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17280 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
17290 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
172a0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
172b0 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
172c0 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
172d0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
172e0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
172f0 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
17300 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
17310 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
17320 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
17330 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
17340 65 2c 20 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  e, z, pToCol->a[
17350 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
17360 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
17370 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
17380 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
17390 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
173a0 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
173b0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
173c0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
173d0 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
173e0 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
173f0 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
17400 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
17410 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
17420 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
17430 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
17440 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
17450 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
17460 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
17470 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
17480 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
17490 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
174a0 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
174b0 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
174c0 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
174d0 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
174e0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
174f0 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
17500 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
17510 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  pFKey ){.    sql
17520 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
17530 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
17540 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
17550 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
17560 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
17570 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
17580 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
17590 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
175a0 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
175b0 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
175c0 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
175d0 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
175e0 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
175f0 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
17600 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
17610 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
17620 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
17630 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
17640 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
17650 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
17660 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
17670 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
17680 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
17690 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
176a0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
176b0 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
176c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
176d0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
176e0 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
176f0 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
17700 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
17710 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
17720 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
17730 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
17740 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
17750 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
17760 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
17770 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
17780 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
17790 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
177a0 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
177b0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
177c0 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
177d0 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
177e0 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
177f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17800 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
17810 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
17820 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
17830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17840 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
17850 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
17860 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
17870 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
17880 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
17890 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
178a0 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
178b0 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
178c0 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
178d0 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
178e0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
178f0 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
17900 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
17910 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
17920 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
17930 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17940 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
17950 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
17960 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
17970 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
17980 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
17990 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
179a0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
179b0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
179c0 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
179d0 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
179e0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
179f0 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
17a00 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
17a10 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
17a20 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
17a30 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
17a40 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
17a50 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
17a60 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
17a70 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
17a80 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
17a90 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
17aa0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
17ab0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
17ac0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
17ad0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
17ae0 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
17af0 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
17b00 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
17b10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
17b20 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
17b30 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
17b40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
17b50 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
17b60 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
17b70 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
17b80 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
17b90 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
17ba0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
17bb0 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
17bc0 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
17bd0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
17be0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
17bf0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
17c00 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
17c10 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
17c20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
17c30 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
17c40 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
17c50 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
17c60 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
17c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
17c80 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
17c90 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
17ca0 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
17cb0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
17cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17cd0 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
17ce0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
17cf0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
17d00 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17d10 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
17d20 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
17d30 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
17d60 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
17d70 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
17d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17d90 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
17da0 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
17db0 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dd0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
17de0 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
17df0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
17e00 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
17e10 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
17e20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
17e30 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
17e40 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17e60 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
17e70 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
17e80 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
17e90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17ea0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
17eb0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
17ec0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
17ed0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
17ee0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
17ef0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
17f00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17f10 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
17f20 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
17f30 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
17f40 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
17f50 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
17f60 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
17f70 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
17f80 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
17f90 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
17fa0 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
17fb0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
17fc0 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
17fd0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
17fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
17ff0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
18000 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
18010 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
18020 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
18030 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
18040 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
18050 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
18060 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
18070 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
18080 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
18090 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
180a0 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
180b0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
180c0 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
180d0 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65   pIndex);.  asse
180e0 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
180f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18100 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
18110 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
18120 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
18130 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65  if we are to use
18140 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74   one. */.  iSort
18150 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  er = pParse->nTa
18160 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
18170 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
18180 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74  orterOpen, iSort
18190 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  er, 0, pIndex->n
181a0 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a  KeyCol, (char*).
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
181d0 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f  foRef(pKey), P4_
181e0 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20  KEYINFO);..  /* 
181f0 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
18200 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
18210 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
18220 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
18230 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
18240 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
18250 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
18260 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
18270 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
18280 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
18290 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
182a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
182b0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
182c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
182d0 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
182e0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
182f0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
18300 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
18310 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c  (pParse);..  sql
18320 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
18330 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64  xKey(pParse,pInd
18340 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72  ex,iTab,regRecor
18350 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62  d,0,&iPartIdxLab
18360 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  el,0,0);.  sqlit
18370 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18380 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
18390 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
183a0 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
183b0 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
183c0 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74  el(pParse, iPart
183d0 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
183e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
183f0 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
18400 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
18410 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
18420 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18430 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69  e(v, addr1);.  i
18440 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30  f( memRootPage<0
18450 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
18460 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
18470 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
18480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18490 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  4(v, OP_OpenWrit
184a0 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69  e, iIdx, tnum, i
184b0 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Db, .           
184c0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
184d0 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
184e0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
184f0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
18500 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65  LAG_BULKCSR|((me
18510 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50  mRootPage>=0)?OP
18520 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29  FLAG_P2ISREG:0))
18530 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  ;..  addr1 = sql
18540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18550 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
18560 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64   iSorter, 0); Vd
18570 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18580 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
18590 65 78 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ex(pIndex) ){.  
185a0 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74    int j2 = sqlit
185b0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
185c0 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
185d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
185e0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
185f0 69 74 65 33 56 64 62 65 56 65 72 69 66 79 41 62  ite3VdbeVerifyAb
18600 6f 72 74 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62  ortable(v, OE_Ab
18610 6f 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ort);.    sqlite
18620 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
18630 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61  , OP_SorterCompa
18640 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c  re, iSorter, j2,
18650 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65       pIndex->nKe
18680 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
18690 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
186a0 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
186b0 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41  int(pParse, OE_A
186c0 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20  bort, pIndex);. 
186d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
186e0 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20  mpHere(v, j2);. 
186f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
18700 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
18710 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
18720 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
18730 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
18740 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
18750 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64  , regRecord, iId
18760 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
18770 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
18780 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20  ekEnd, iIdx);.  
18790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
187a0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
187b0 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f  t, iIdx, regReco
187c0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
187d0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
187e0 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
187f0 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  LT);.  sqlite3Re
18800 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18810 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
18820 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18830 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
18840 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20  rNext, iSorter, 
18850 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65  addr2); VdbeCove
18860 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
18870 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18880 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c  , addr1);..  sql
18890 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
188a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
188b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
188c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
188d0 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  se, iIdx);.  sql
188e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
188f0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72  , OP_Close, iSor
18900 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ter);.}../*.** A
18910 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61  llocate heap spa
18920 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e  ce to hold an In
18930 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20  dex object with 
18940 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a  nCol columns..**
18950 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
18960 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
18970 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65   to provide an e
18980 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65  xtra nExtra byte
18990 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61  s.** of 8-byte a
189a0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74  ligned space aft
189b0 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  er the Index obj
189c0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ect and return a
189d0 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
189e0 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20  his extra space 
189f0 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a  in *ppExtra..*/.
18a00 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c  Index *sqlite3Al
18a10 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
18a20 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
18a30 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ,         /* Dat
18a40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18a50 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20   */.  i16 nCol, 
18a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
18a70 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  tal number of co
18a80 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
18a90 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ex */.  int nExt
18aa0 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra,          /* 
18ab0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
18ac0 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74  of extra space t
18ad0 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61  o alloc */.  cha
18ae0 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20  r **ppExtra     
18af0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
18b00 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63  the "extra" spac
18b10 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
18b20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
18b30 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * Allocated inde
18b40 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  x object */.  in
18b50 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
18b60 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
18b70 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f  pace for Index o
18b80 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a  bject + arrays *
18b90 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  /..  nByte = ROU
18ba0 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
18bb0 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  )) +            
18bc0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
18bd0 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20  ture  */.       
18be0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
18bf0 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20  (char*)*nCol) + 
18c00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18c10 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
18c20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
18c30 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
18c40 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a  nCol+1) +     /*
18c50 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45   Index.aiRowLogE
18c60 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st   */.        
18c70 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
18c80 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  i16)*nCol +     
18c90 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
18ca0 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18cc0 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b  izeof(u8)*nCol);
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ce0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
18cf0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
18d00 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
18d10 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61  , nByte + nExtra
18d20 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
18d30 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d    char *pExtra =
18d40 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e   ((char*)p)+ROUN
18d50 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
18d60 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c  );.    p->azColl
18d70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
18d80 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
18d90 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
18da0 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20  (char*)*nCol);. 
18db0 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73     p->aiRowLogEs
18dc0 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78  t = (LogEst*)pEx
18dd0 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73  tra; pExtra += s
18de0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
18df0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61  Col+1);.    p->a
18e00 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
18e10 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45  pExtra;       pE
18e20 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
18e30 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  16)*nCol;.    p-
18e40 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
18e50 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70  8*)pExtra;.    p
18e60 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
18e70 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c  ;.    p->nKeyCol
18e80 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20   = nCol - 1;.   
18e90 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68   *ppExtra = ((ch
18ea0 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a  ar*)p) + nByte;.
18eb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
18ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
18ed0 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
18ee0 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
18ef0 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
18f00 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
18f10 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
18f20 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
18f30 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
18f40 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
18f50 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
18f60 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
18f70 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
18f80 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
18f90 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
18fa0 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
18fb0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
18fc0 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
18fd0 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
18fe0 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
18ff0 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
19000 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
19010 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
19020 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
19030 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
19040 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
19050 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
19060 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
19070 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
19080 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
19090 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
190a0 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
190b0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
190c0 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
190d0 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
190e0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
190f0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
19100 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
19110 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
19120 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
19130 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
19140 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
19150 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
19160 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
19170 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
19180 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
19190 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
191a0 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
191b0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
191c0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
191d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
191e0 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
191f0 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
19200 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
19210 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
19220 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
19230 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
19240 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
19250 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
19260 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
19270 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
19280 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
19290 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
192a0 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
192b0 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
192c0 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
192d0 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
192e0 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
192f0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
19300 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
19310 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
19320 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49  t */.  Expr *pPI
19330 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45  Where,    /* WHE
19340 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61  RE clause for pa
19350 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f  rtial indices */
19360 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
19370 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
19380 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
19390 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
193a0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
193b0 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f  otExist,    /* O
193c0 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
193d0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
193e0 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70  s */.  u8 idxTyp
193f0 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e         /* The
19400 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29   index type */.)
19410 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
19420 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
19430 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
19440 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
19450 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
19460 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
19470 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
19480 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
19490 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
194a0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
194b0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
194c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
194d0 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
194e0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
194f0 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
19500 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
19510 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
19520 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
19530 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
19540 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
19550 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
19560 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
19570 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
19580 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
19590 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
195a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
195b0 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
195c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
195d0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
195e0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
195f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19600 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
19610 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
19620 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
19630 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
19640 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
19650 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
19660 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
19670 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
19680 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
19690 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
196a0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
196b0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
196c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
196d0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
196e0 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72  ocated for zExtr
196f0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  a[] */.  int nEx
19700 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  traCol;         
19710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19720 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c  ber of extra col
19730 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  umns needed */. 
19740 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
19750 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19760 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
19770 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
19780 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64   object */.  Ind
19790 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
197a0 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
197b0 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
197c0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
197d0 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
197e0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
197f0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
19800 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19810 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
19820 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45    if( IN_DECLARE
19830 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65  _VTAB && idxType
19840 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
19850 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20  _PRIMARYKEY ){. 
19860 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19870 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
19880 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
19890 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
198a0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
198b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
198c0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
198d0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
198e0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
198f0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
19900 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
19910 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
19920 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
19930 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
19940 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
19950 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
19960 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
19970 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
19980 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
19990 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
199a0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
199b0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
199c0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
199d0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
199e0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
199f0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
19a00 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
19a10 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
19a20 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
19a30 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
19a40 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
19a50 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19a60 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
19a70 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
19a80 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
19a90 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
19aa0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
19ab0 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
19ac0 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
19ad0 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
19ae0 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
19af0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
19b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
19b10 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
19b20 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
19b30 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
19b40 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
19b50 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
19b60 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
19b70 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
19b80 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
19b90 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
19ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
19bb0 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
19bc0 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
19bd0 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
19be0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
19bf0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
19c00 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
19c10 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
19c20 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
19c30 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
19c40 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
19c50 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
19c60 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
19c70 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
19c80 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
19c90 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
19ca0 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
19cb0 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
19cc0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
19cd0 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
19ce0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
19cf0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
19d00 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
19d10 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
19d20 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
19d30 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
19d40 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
19d50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19d60 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
19d70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
19d80 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
19d90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19da0 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
19db0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
19dc0 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
19dd0 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
19de0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19df0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
19e00 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
19e10 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
19e20 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
19e30 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
19e40 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
19e50 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19e60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19e70 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
19e80 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
19e90 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
19ea0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
19eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
19ec0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
19ed0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19ee0 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
19ef0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
19f00 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
19f10 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
19f20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19f30 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
19f40 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
19f50 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
19f60 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
19f70 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
19f80 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
19f90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19fa0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
19fb0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
19fc0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
19fd0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
19fe0 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
19ff0 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
1a000 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  =0.#if SQLITE_US
1a010 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
1a020 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  N.       && sqli
1a030 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
1a040 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  (pTab->zName)==0
1a050 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1a060 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49  QLITE_ALLOW_SQLI
1a070 54 45 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a  TE_MASTER_INDEX.
1a080 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1a090 33 53 74 72 49 43 6d 70 28 26 70 54 61 62 2d 3e  3StrICmp(&pTab->
1a0a0 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72  zName[7],"master
1a0b0 22 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20  ")!=0.#endif.   
1a0c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a0d0 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  rNICmp(&pTab->zN
1a0e0 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
1a0f0 5f 22 2c 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20  _",9)!=0. ){.   
1a100 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a110 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1a120 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
1a130 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
1a140 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
1a150 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a160 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
1a170 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
1a180 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1a190 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
1a1a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a1b0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
1a1c0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
1a1d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a1e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
1a1f0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
1a200 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1a210 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
1a220 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1a230 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a240 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
1a250 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
1a260 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
1a270 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1a280 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a290 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
1a2a0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
1a2b0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
1a2c0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
1a2d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1a2e0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
1a2f0 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
1a300 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
1a310 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
1a320 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
1a330 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
1a340 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
1a350 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
1a360 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
1a370 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
1a380 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
1a390 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
1a3a0 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
1a3b0 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
1a3c0 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
1a3d0 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
1a3e0 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
1a3f0 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
1a400 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
1a410 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
1a420 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
1a430 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
1a440 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
1a450 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
1a460 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
1a470 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
1a480 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1a490 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
1a4a0 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
1a4b0 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
1a4c0 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
1a4d0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1a4e0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1a4f0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
1a500 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
1a510 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a520 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1a530 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
1a540 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1a550 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
1a560 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
1a570 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
1a580 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a590 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a5a0 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  .    if( !IN_REN
1a5b0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1a5c0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
1a5d0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
1a5e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1a5f0 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
1a600 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1a610 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a620 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
1a630 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1a640 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
1a650 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1a660 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a670 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a680 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
1a6a0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
1a6b0 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  me, pDb->zDbSNam
1a6c0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1a6d0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
1a6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1a6f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a700 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
1a710 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
1a720 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1a730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a740 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
1a750 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
1a760 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1a770 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1a780 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1a790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
1a7a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a7b0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1a7c0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1a7d0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
1a7e0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
1a7f0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
1a800 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
1a810 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
1a820 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
1a830 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
1a840 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
1a850 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
1a860 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
1a870 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
1a880 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1a890 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a8a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a  e_index;.    }..
1a8b0 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
1a8c0 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e   index names gen
1a8d0 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68  erated from with
1a8e0 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  in sqlite3_decla
1a8f0 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a  re_vtab().    **
1a900 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73   must have names
1a910 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e   that are distin
1a920 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61  ct from normal a
1a930 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
1a940 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ames..    ** The
1a950 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
1a960 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73  ment converts "s
1a970 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78  qlite3_autoindex
1a980 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ..." into.    **
1a990 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e   "sqlite3_butoin
1a9a0 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72  dex..." in order
1a9b0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
1a9c0 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20  es distinct..   
1a9d0 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72   ** The "vtab_er
1a9e0 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d  r.test" test dem
1a9f0 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65  onstrates the ne
1aa00 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65  ed of this state
1aa10 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ment. */.    if(
1aa20 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53   IN_SPECIAL_PARS
1aa30 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a  E ) zName[7]++;.
1aa40 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1aa50 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
1aa60 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
1aa70 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
1aa80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1aa90 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
1aaa0 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  f( !IN_RENAME_OB
1aab0 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73  JECT ){.    cons
1aac0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
1aad0 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b->zDbSName;.   
1aae0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1aaf0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1ab00 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
1ab10 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
1ab20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1ab30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ab40 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1ab50 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
1ab60 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
1ab70 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1ab80 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
1ab90 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1aba0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1abb0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1abc0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
1abd0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
1abe0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
1abf0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ac00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1ac10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ac20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
1ac30 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
1ac40 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
1ac50 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
1ac60 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
1ac70 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
1ac80 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
1ac90 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
1aca0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
1acb0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
1acc0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
1acd0 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
1ace0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
1acf0 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
1ad00 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1ad10 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61   &pTab->aCol[pTa
1ad20 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20  b->nCol-1];.    
1ad30 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
1ad40 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  = COLFLAG_UNIQUE
1ad50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
1ad60 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c  enInit(&prevCol,
1ad70 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
1ad80 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1ad90 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1ada0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
1adb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1adc0 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
1add0 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
1ade0 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
1adf0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
1ae00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1ae10 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1ae20 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
1ae30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1ae40 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
1ae50 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
1ae60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1ae70 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
1ae80 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
1ae90 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
1aea0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  );.  }..  /* Fig
1aeb0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1aec0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
1aed0 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
1aee0 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
1aef0 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
1af00 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1af10 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
1af20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1af30 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1af40 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1af50 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
1af60 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1af70 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
1af80 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1af90 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1afa0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
1afb0 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
1afc0 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
1afd0 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
1afe0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
1aff0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
1b000 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
1b010 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1b020 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
1b030 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
1b040 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
1b050 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78  ol : 1;.  pIndex
1b060 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
1b070 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
1b080 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
1b090 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0c0 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
1b0d0 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
1b0e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b0f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1b100 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b110 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1b120 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1b130 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
1b140 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
1b150 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1b160 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1b170 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
1b180 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
1b190 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
1b1a0 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
1b1b0 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
1b1c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
1b1d0 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
1b1e0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
1b1f0 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
1b200 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
1b210 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
1b220 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
1b230 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
1b240 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
1b250 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
1b260 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
1b270 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
1b280 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78  Schema;.  pIndex
1b290 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73  ->nKeyCol = pLis
1b2a0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
1b2b0 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20  pPIWhere ){.    
1b2c0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1b2d0 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
1b2e0 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72  se, pTab, NC_Par
1b2f0 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20  tIdx, pPIWhere, 
1b300 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  0);.    pIndex->
1b310 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20  pPartIdxWhere = 
1b320 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50  pPIWhere;.    pP
1b330 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  IWhere = 0;.  }.
1b340 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b350 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1b360 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1b370 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1b380 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
1b390 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
1b3a0 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
1b3b0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
1b3c0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
1b3d0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
1b3e0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
1b3f0 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
1b400 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
1b410 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
1b420 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
1b430 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
1b440 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
1b450 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  e the list of ex
1b460 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66  pressions that f
1b470 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66  orm the terms of
1b480 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20   the index and. 
1b490 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65   ** report any e
1b4a0 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63  rrors.  In the c
1b4b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
1b4c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b4d0 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20  is exactly.  ** 
1b4e0 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20  a table column, 
1b4f0 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  store that colum
1b500 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  n in aiColumn[].
1b510 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78    For general ex
1b520 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20  pressions,.  ** 
1b530 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d  populate pIndex-
1b540 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74  >aColExpr and st
1b550 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29  ore XN_EXPR (-2)
1b560 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a   in aiColumn[]..
1b570 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1b580 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
1b590 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
1b5a0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1b5b0 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63 61  dex are identica
1b5c0 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  l..  ** TODO: Is
1b5d0 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1b5e0 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61   the table prima
1b5f0 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 61  ry key is used a
1b600 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
1b610 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20  ** index key..  
1b620 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d  */.  pListItem =
1b630 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28   pList->a;.  if(
1b640 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
1b650 54 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  T ){.    pIndex-
1b660 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73  >aColExpr = pLis
1b670 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  t;.    pList = 0
1b680 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b690 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   i<pIndex->nKeyC
1b6a0 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  ol; i++, pListIt
1b6b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
1b6c0 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20  *pCExpr;        
1b6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b6e0 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72   i-th index expr
1b6f0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ession */.    in
1b700 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
1b710 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  rder;        /* 
1b720 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74  ASC or DESC on t
1b730 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69  he i-th expressi
1b740 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
1b750 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
1b760 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
1b770 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1b780 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69  ame */..    sqli
1b790 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c  te3StringToId(pL
1b7a0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  istItem->pExpr);
1b7b0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1b7c0 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
1b7d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
1b7e0 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74  C_IdxExpr, pList
1b7f0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Item->pExpr, 0);
1b800 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1b810 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
1b820 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b830 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c      pCExpr = sql
1b840 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1b850 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  ate(pListItem->p
1b860 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
1b870 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  CExpr->op!=TK_CO
1b880 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
1b890 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1b8a0 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1b8b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b8c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
1b8d0 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62  pressions prohib
1b8e0 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20  ited in PRIMARY 
1b8f0 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20  KEY and ".      
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55            "UNIQU
1b920 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  E constraints");
1b930 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1b940 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b960 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  f( pIndex->aColE
1b970 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xpr==0 ){.      
1b980 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1b990 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  pr = pList;.    
1b9a0 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
1b9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d       }.      j =
1b9c0 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20   XN_EXPR;.      
1b9d0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b9e0 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20  [i] = XN_EXPR;. 
1b9f0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1ba00 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1ba10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1ba20 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75   = pCExpr->iColu
1ba30 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mn;.      assert
1ba40 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20  ( j<=0x7fff );. 
1ba50 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a       if( j<0 ){.
1ba60 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62          j = pTab
1ba70 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d  ->iPKey;.      }
1ba80 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61  else if( pTab->a
1ba90 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
1baa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
1bab0 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1bac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1bad0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1bae0 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a  lumn[i] = (i16)j
1baf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c  ;.    }.    zCol
1bb00 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  l = 0;.    if( p
1bb10 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
1bb20 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
1bb30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  ){.      int nCo
1bb40 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ll;.      zColl 
1bb50 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  = pListItem->pEx
1bb60 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1bb70 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69      nColl = sqli
1bb80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
1bb90 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73  l) + 1;.      as
1bba0 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43  sert( nExtra>=nC
1bbb0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  oll );.      mem
1bbc0 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c  cpy(zExtra, zCol
1bbd0 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, nColl);.     
1bbe0 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
1bbf0 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
1bc00 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45   nColl;.      nE
1bc10 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra -= nColl;. 
1bc20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d     }else if( j>=
1bc30 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  0 ){.      zColl
1bc40 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
1bc50 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .zColl;.    }.  
1bc60 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a    if( !zColl ) z
1bc70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
1bc80 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28  rBINARY;.    if(
1bc90 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
1bca0 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
1bcb0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1bcc0 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
1bcd0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1bce0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1bcf0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1bd00 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  l[i] = zColl;.  
1bd10 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f    requestedSortO
1bd20 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d  rder = pListItem
1bd30 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f  ->sortOrder & so
1bd40 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
1bd50 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1bd60 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71  der[i] = (u8)req
1bd70 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
1bd80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
1bd90 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20  d the table key 
1bda0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1bdb0 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49  e index.  For WI
1bdc0 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a  THOUT ROWID.  **
1bdd0 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50   tables (when pP
1bde0 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20  k!=0) this will 
1bdf0 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  be the declared 
1be00 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
1be10 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61  r.  ** normal ta
1be20 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d  bles (when pPk==
1be30 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1be40 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a  the rowid..  */.
1be50 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20    if( pPk ){.   
1be60 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1be70 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1be80 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
1be90 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  k->aiColumn[j];.
1bea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e        assert( x>
1beb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1bec0 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78  hasColumn(pIndex
1bed0 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64  ->aiColumn, pInd
1bee0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20  ex->nKeyCol, x) 
1bef0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1bf00 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20  x->nColumn--; . 
1bf10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bf20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1bf30 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20  lumn[i] = x;.   
1bf40 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43       pIndex->azC
1bf50 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[i] = pPk->az
1bf60 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
1bf70 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1bf80 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53  der[i] = pPk->aS
1bf90 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
1bfa0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1bfb0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1bfc0 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e  rt( i==pIndex->n
1bfd0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73  Column );.  }els
1bfe0 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  e{.    pIndex->a
1bff0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f  iColumn[i] = XN_
1c000 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65  ROWID;.    pInde
1c010 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73  x->azColl[i] = s
1c020 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1c030 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
1c040 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
1c050 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  ex);.  if( pPars
1c060 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
1c070 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  ) estimateIndexW
1c080 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20  idth(pIndex);.. 
1c090 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65   /* If this inde
1c0a0 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79  x contains every
1c0b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74   column of its t
1c0c0 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a  able, then mark.
1c0d0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76    ** it as a cov
1c0e0 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
1c0f0 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69   assert( HasRowi
1c100 64 28 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c  d(pTab) .      |
1c110 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  | pTab->iPKey<0 
1c120 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  || sqlite3Column
1c130 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20  OfIndex(pIndex, 
1c140 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20  pTab->iPKey)>=0 
1c150 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f  );.  recomputeCo
1c160 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28  lumnsNotIndexed(
1c170 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70  pIndex);.  if( p
1c180 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49  TblName!=0 && pI
1c190 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  ndex->nColumn>=p
1c1a0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1c1b0 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1c1c0 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  ing = 1;.    for
1c1d0 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1c1e0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1c1f0 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
1c200 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
1c210 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c220 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1c230 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e  ndex,j)>=0 ) con
1c240 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e  tinue;.      pIn
1c250 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1c260 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1c270 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1c280 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1c290 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1c2a0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
1c2b0 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
1c2c0 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
1c2d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
1c2e0 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
1c2f0 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
1c300 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1c310 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
1c320 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
1c330 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
1c340 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1c350 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
1c360 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
1c370 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
1c380 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
1c390 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
1c3a0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
1c3b0 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
1c3c0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1c3d0 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
1c3e0 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
1c3f0 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
1c400 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
1c410 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
1c420 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
1c430 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
1c440 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
1c450 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
1c460 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
1c470 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
1c480 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1c490 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
1c4a0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
1c4b0 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
1c4c0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
1c4d0 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1c4e0 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
1c4f0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1c500 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1c510 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
1c520 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
1c530 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
1c540 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
1c550 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
1c560 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
1c570 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
1c580 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1c590 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
1c5a0 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
1c5b0 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
1c5c0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
1c5d0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
1c5e0 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
1c5f0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
1c600 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
1c610 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
1c620 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
1c630 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
1c640 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
1c650 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
1c660 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1c670 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
1c680 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
1c690 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
1c6a0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
1c6b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c6c0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1c6d0 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dx) );.      ass
1c6e0 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79  ert( pIdx->idxTy
1c6f0 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1c700 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20  PE_APPDEF );.   
1c710 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1c720 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
1c730 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
1c740 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49  Idx->nKeyCol!=pI
1c750 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
1c760 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c770 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
1c780 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a  >nKeyCol; k++){.
1c790 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1c7a0 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
1c7b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
1c7c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c7d0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1c7e0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]>=0 );.        
1c7f0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
1c800 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
1c810 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
1c820 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
1c830 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
1c840 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
1c850 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
1c860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1c870 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1c880 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
1c890 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c8a0 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  k==pIdx->nKeyCol
1c8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1c8c0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
1c8d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
1c8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1c8f0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
1c900 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
1c910 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
1c920 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
1c930 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
1c940 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
1c950 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
1c960 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
1c970 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1c980 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
1c990 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
1c9a0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
1c9b0 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
1c9c0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1c9d0 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
1c9e0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
1c9f0 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
1ca00 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
1ca10 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
1ca20 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
1ca30 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
1ca40 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
1ca50 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
1ca60 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
1ca70 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69  havior for the i
1ca80 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
1ca90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1caa0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
1cab0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
1cac0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1cad0 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1caf0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1cb00 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1cb10 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
1cb20 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
1cb30 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
1cb40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1cb50 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1cb60 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1cb70 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
1cb80 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
1cb90 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
1cba0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
1cbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1cbc0 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54          if( idxT
1cbd0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
1cbe0 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
1cbf0 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d   pIdx->idxType =
1cc00 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20   idxType;.      
1cc10 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1cc20 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
1cc30 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1cc40 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  t = pParse->pNew
1cc50 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20  Index;.         
1cc60 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1cc70 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1cc80 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
1cc90 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1cca0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1ccb0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1ccc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ccd0 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
1cce0 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20  _OBJECT ){..    
1ccf0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
1cd00 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1cd10 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
1cd20 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
1cd30 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
1cd40 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
1cd50 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  es. .    */.    
1cd60 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1cd70 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69  nErr==0 );.    i
1cd80 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1cd90 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
1cda0 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  *p;.      assert
1cdb0 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41  ( !IN_SPECIAL_PA
1cdc0 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RSE );.      ass
1cdd0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1cde0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1cdf0 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
1ce00 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ma) );.      if(
1ce10 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1ce20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1ce30 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
1ce40 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20  newTnum;.       
1ce50 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
1ce60 78 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f  xHasDuplicateRoo
1ce70 74 50 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b  tPage(pIndex) ){
1ce80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1ce90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1cea0 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74  e, "invalid root
1ceb0 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20  page");.        
1cec0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1ced0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1cee0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
1cef0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1cf00 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ndex;.        }.
1cf10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20        }.      p 
1cf20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1cf30 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
1cf40 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
1cf50 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1cf60 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29  ->zName, pIndex)
1cf70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 7b  ;.      if( p ){
1cf80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cf90 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
1cfa0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
1cfb0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
1cfc0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1cfd0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1cfe0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1cff0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1d000 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46  }.      db->mDbF
1d010 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
1d020 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20  chemaChange;.   
1d030 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d040 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
1d050 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
1d060 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
1d070 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
1d080 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73  .    ** index is
1d090 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   an implied inde
1d0a0 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f  x for a UNIQUE o
1d0b0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1d0c0 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20  nstraint) then. 
1d0d0 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20     ** emit code 
1d0e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
1d0f0 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f  index rootpage o
1d100 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20  n disk and make 
1d110 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20  an entry for.   
1d120 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e   ** the index in
1d130 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1d140 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70  er table and pop
1d150 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ulate the index 
1d160 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  with.    ** cont
1d170 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
1d180 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
1d190 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
1d1a0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
1d1b0 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  ster.    ** tabl
1d1c0 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1d1d0 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1d1e0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1d1f0 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1d200 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  .    ** of a WIT
1d210 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1d220 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d230 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
1d240 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
1d250 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
1d260 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
1d270 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a  IMARY KEY.    **
1d280 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
1d290 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
1d2a0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
1d2b0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
1d2c0 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62     ** has just b
1d2d0 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
1d2e0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
1d2f0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
1d300 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
1d310 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
1d320 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
1d330 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 48 61  .    else if( Ha
1d340 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
1d350 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1d360 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20       Vdbe *v;.  
1d370 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
1d380 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  .      int iMem 
1d390 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1d3a0 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c  ;..      v = sql
1d3b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1d3c0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76  se);.      if( v
1d3d0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1d3e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
1d3f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
1d400 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1d410 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1d420 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
1d430 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
1d440 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  or the index usi
1d450 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20  ng CreateIndex. 
1d460 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20  But before.     
1d470 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f   ** doing so, co
1d480 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75  de a Noop instru
1d490 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ction and store 
1d4a0 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a  its address in .
1d4b0 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74        ** Index.t
1d4c0 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71  num. This is req
1d4d0 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
1d4e0 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75  is index is actu
1d4f0 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a  ally a .      **
1d500 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1d510 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63   the table is ac
1d520 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54  tually a WITHOUT
1d530 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e   ROWID table. In
1d540 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20   .      ** that 
1d550 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74  case the convert
1d560 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
1d570 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ble() routine wi
1d580 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20  ll replace.     
1d590 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74   ** the Noop wit
1d5a0 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70  h a Goto to jump
1d5b0 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63   over the VDBE c
1d5c0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
1d5d0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  low. */.      pI
1d5e0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c  ndex->tnum = sql
1d5f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1d600 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
1d610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d620 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
1d630 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d  Btree, iDb, iMem
1d640 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29  , BTREE_BLOBKEY)
1d650 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68  ;..      /* Gath
1d660 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
1d670 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
1d680 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1d690 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a  nt into.      **
1d6a0 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
1d6b0 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
1d6c0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1d6d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
1d6e0 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
1d6f0 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
1d700 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
1d710 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
1d720 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
1d730 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1d740 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a   n--;.        /*
1d750 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1d760 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1d770 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1d780 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1d790 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
1d7a0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
1d7b0 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
1d7c0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1d7d0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1d7e0 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1d7f0 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1d800 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d810 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
1d820 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
1d830 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
1d840 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1d850 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1d860 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
1d870 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
1d880 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  "); */.        z
1d890 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d8a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  }..      /* Add 
1d8b0 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
1d8c0 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
1d8d0 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a  is index.      *
1d8e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  /.      sqlite3N
1d8f0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1d900 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49  e, .          "I
1d910 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
1d920 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
1d930 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
1d940 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
1d950 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1d960 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
1d970 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1d980 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1d990 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
1d9a0 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20           iMem,. 
1d9b0 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20           zStmt. 
1d9c0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1d9d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d9e0 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1d9f0 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
1da00 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
1da10 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
1da20 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
1da30 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a  P_Expire.      *
1da40 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
1da50 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
1da60 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
1da70 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1da80 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
1da90 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1daa0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1dab0 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
1dac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1dad0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1dae0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1daf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1db00 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72  rseSchemaOp(pPar
1db10 73 65 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  se, iDb,.       
1db20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1db30 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1db40 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1db50 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1db60 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ame));.        s
1db70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1db80 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
1db90 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
1dba0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1dbb0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64  JumpHere(v, pInd
1dbc0 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d  ex->tnum);.    }
1dbd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
1dbe0 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
1dbf0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1dc00 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
1dc10 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
1dc20 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
1dc30 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
1dc40 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
1dc50 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
1dc60 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
1dc70 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1dc80 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
1dc90 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
1dca0 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
1dcb0 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
1dcc0 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
1dcd0 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
1dce0 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
1dcf0 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
1dd00 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
1dd10 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1dd20 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
1dd30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
1dd40 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1dd50 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1dd60 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1dd70 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
1dd80 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
1dd90 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
1dda0 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
1ddb0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
1ddc0 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
1ddd0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
1dde0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
1ddf0 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
1de00 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
1de10 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
1de20 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
1de30 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
1de40 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
1de50 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
1de60 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
1de70 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1de80 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
1de90 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
1dea0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
1deb0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1dec0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65  dex = 0;.  }.  e
1ded0 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  lse if( IN_RENAM
1dee0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1def0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1df00 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  pNewIndex==0 );.
1df10 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
1df20 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1df30 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1df40 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1df50 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1df60 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1df70 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1df80 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33 46 72  ndex ) sqlite3Fr
1df90 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1dfa0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1dfb0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1dfc0 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1dfd0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1dfe0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1dff0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1e000 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1e010 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1e020 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  e(db, zName);.}.
1e030 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1e040 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1e050 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1e060 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1e070 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1e080 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1e090 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1e0a0 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1e0b0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1e0c0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1e0d0 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
1e0e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1e0f0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
1e100 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
1e110 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
1e120 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
1e130 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
1e140 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1e150 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
1e160 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
1e170 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1e180 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
1e190 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
1e1a0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1e1b0 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
1e1c0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1e1d0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
1e1e0 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
1e1f0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1e200 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lar combination 
1e210 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1e220 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1e230 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1e240 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1e250 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1e260 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1e270 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1e280 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1e290 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1e2a0 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1e2b0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1e2c0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1e2d0 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1e2e0 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1e2f0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1e300 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1e310 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1e320 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1e330 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1e340 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1e350 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1e360 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1e370 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e380 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1e390 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f  ndex *pIdx){.  /
1e3a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e3b0 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c   10,  9,  8,  7,
1e3c0 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20    6 */.  LogEst 
1e3d0 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33  aVal[] = { 33, 3
1e3e0 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b  2, 30, 28, 26 };
1e3f0 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70  .  LogEst *a = p
1e400 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
1e410 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20  ;.  int nCopy = 
1e420 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56  MIN(ArraySize(aV
1e430 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  al), pIdx->nKeyC
1e440 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ol);.  int i;.. 
1e450 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68   /* Indexes with
1e460 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74   default row est
1e470 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f  imates should no
1e480 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74  t have stat1 dat
1e490 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  a */.  assert( !
1e4a0 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
1e4b0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1e4c0 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d  first entry (num
1e4d0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1e4e0 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65  he index) to the
1e4f0 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a   estimated .  **
1e500 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1e510 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1e520 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72   half the number
1e530 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1e540 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61  table.  ** for a
1e550 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20   partial index. 
1e560 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74    But do not let
1e570 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72   the estimate dr
1e580 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a  op below 10. */.
1e590 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70    a[0] = pIdx->p
1e5a0 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
1e5b0 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  t;.  if( pIdx->p
1e5c0 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
1e5d0 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61  ) a[0] -= 10;  a
1e5e0 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
1e5f0 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
1e600 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1e610 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1e620 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1e630 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 33==sqlite3Lo
1e640 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f  gEst(10) );..  /
1e650 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20  * Estimate that 
1e660 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d  a[1] is 10, a[2]
1e670 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38   is 9, a[3] is 8
1e680 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35  , a[4] is 7, a[5
1e690 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20  ] is.  ** 6 and 
1e6a0 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1e6b0 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69  value (if any) i
1e6c0 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  s 5.  */.  memcp
1e6d0 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e  y(&a[1], aVal, n
1e6e0 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45  Copy*sizeof(LogE
1e6f0 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  st));.  for(i=nC
1e700 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  opy+1; i<=pIdx->
1e710 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1e720 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20     a[i] = 23;   
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c   assert( 23==sql
1e750 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b  ite3LogEst(5) );
1e760 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e770 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1e780 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55  (1) );.  if( IsU
1e790 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1e7a0 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43   ) a[pIdx->nKeyC
1e7b0 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ol] = 0;.}../*.*
1e7c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1e7d0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1e7e0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1e7f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1e800 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1e810 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1e820 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1e830 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1e840 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e850 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1e860 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1e870 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1e880 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1e890 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1e8a0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1e8b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e8c0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1e8d0 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1e8e0 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1e8f0 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1e900 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1e910 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1e920 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1e930 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1e940 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1e950 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1e960 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1e970 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1e980 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e990 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1e9a0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1e9b0 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1e9c0 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1e9d0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1e9e0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1e9f0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1ea00 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1ea10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ea20 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1ea30 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1ea40 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1ea50 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1ea60 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1ea70 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1ea80 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1ea90 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1eaa0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1eab0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1eac0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1ead0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1eae0 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
1eaf0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
1eb00 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEF ){.    sqlit
1eb10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1eb20 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
1eb30 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
1eb40 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
1eb50 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1eb60 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
1eb70 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
1eb80 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1eb90 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
1eba0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1ebb0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
1ebc0 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  x->pSchema);.  s
1ebd0 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69 74  qlite3SchemaWrit
1ebe0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
1ebf0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1ec00 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1ec10 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1ec20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1ec30 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1ec40 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1ec50 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1ec60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1ec70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1ec80 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
1ec90 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
1eca0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1ecb0 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
1ecc0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1ecd0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
1ece0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
1ecf0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1ed00 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ed10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1ed20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
1ed30 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
1ed40 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
1ed50 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
1ed60 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1ed70 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
1ed80 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
1ed90 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
1eda0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1edb0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1edc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1edd0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ede0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
1edf0 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
1ee00 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
1ee10 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1ee20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1ee30 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1ee40 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1ee50 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1ee60 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
1ee70 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1ee80 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1ee90 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
1eea0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
1eeb0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1eec0 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
1eed0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1eee0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
1eef0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1ef00 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1ef10 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1ef20 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1ef30 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1ef40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1ef50 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1ef60 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1ef70 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1ef80 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1ef90 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1efa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1efb0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1efc0 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1efd0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1efe0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1eff0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1f000 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f010 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1f020 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1f030 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1f040 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1f050 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1f060 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1f070 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1f080 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1f090 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1f0a0 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1f0b0 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1f0c0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1f0d0 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1f0e0 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1f0f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1f100 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f110 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1f120 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1f130 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1f140 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1f150 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1f160 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1f170 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1f180 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1f190 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1f1a0 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1f1b0 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1f1c0 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1f1d0 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1f1e0 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1f1f0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1f200 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1f210 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1f220 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1f230 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1f240 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1f250 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f260 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1f270 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1f280 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1f290 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1f2a0 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1f2b0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1f2c0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1f2d0 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1f2e0 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1f2f0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1f300 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1f310 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1f320 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1f330 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1f340 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1f350 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1f360 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1f370 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1f380 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1f390 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1f3a0 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1f3b0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1f3c0 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1f3d0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1f3e0 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1f3f0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1f400 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1f410 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1f420 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1f430 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1f440 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1f450 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1f460 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1f470 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1f480 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1f490 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1f4a0 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1f4b0 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1f4c0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1f4d0 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1f4e0 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1f4f0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1f500 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1f510 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1f520 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1f530 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1f540 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1f550 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1f560 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1f570 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1f580 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1f590 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1f5a0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1f5b0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1f5c0 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1f5d0 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1f5e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1f5f0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1f600 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1f610 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1f620 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1f630 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1f640 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1f650 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1f660 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1f670 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1f680 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1f690 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
1f6a0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
1f6b0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1f6c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f6d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1f6e0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1f6f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1f700 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1f710 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1f720 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
1f730 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1f740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1f750 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
1f760 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1f770 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
1f780 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
1f790 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
1f7a0 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c  a[0]),.      &pL
1f7b0 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
1f7c0 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c  &i.  );.  if( i<
1f7d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1f7e0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1f7f0 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1f800 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1f810 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1f820 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1f830 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
1f840 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  );.  if( IN_RENA
1f850 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69  ME_OBJECT && pLi
1f860 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
1f870 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
1f880 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72  ameTokenMap(pPar
1f890 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73 74  se, (void*)pList
1f8a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
1f8b0 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  oken);.  }.  ret
1f8c0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
1f8d0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
1f8e0 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
1f8f0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1f900 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  e(sqlite3 *db, I
1f910 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
1f920 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1f930 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1f940 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1f950 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1f960 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f970 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e(db, pList->a[i
1f980 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
1f990 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f9a0 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
1f9b0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
1f9c0 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1f9d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1f9e0 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
1f9f0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
1fa00 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
1fa10 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
1fa20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
1fa30 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1fa40 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
1fa50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1fa60 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
1fa70 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1fa80 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
1fa90 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1faa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1fab0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1fac0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1fad0 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
1fae0 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1faf0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1fb00 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  * Maximum size o
1fb10 66 20 61 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  f a SrcList obje
1fb20 63 74 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  ct..** The SrcLi
1fb30 73 74 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  st object is use
1fb40 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  d to represent t
1fb50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1fb60 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
1fb70 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65  atement, and the
1fb80 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 63   query planner c
1fb90 61 6e 6e 6f 74 20 64 65 61 6c 20 77 69 74 68 20  annot deal with 
1fba0 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20  more.** than 64 
1fbb0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
1fbc0 2e 20 20 53 6f 20 61 6e 79 20 76 61 6c 75 65 20  .  So any value 
1fbd0 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 20 68  larger than 64 h
1fbe0 65 72 65 0a 2a 2a 20 69 73 20 73 75 66 66 69 63  ere.** is suffic
1fbf0 69 65 6e 74 20 66 6f 72 20 6d 6f 73 74 20 75 73  ient for most us
1fc00 65 73 2e 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c  es.  Smaller val
1fc10 75 65 73 2c 20 6c 69 6b 65 20 73 61 79 20 31 30  ues, like say 10
1fc20 2c 20 61 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72  , are.** appropr
1fc30 69 61 74 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61  iate for small a
1fc40 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65  nd memory-limite
1fc50 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a  d applications..
1fc60 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1fc70 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 0a 23 20  E_MAX_SRCLIST.# 
1fc80 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41  define SQLITE_MA
1fc90 58 5f 53 52 43 4c 49 53 54 20 32 30 30 0a 23 65  X_SRCLIST 200.#e
1fca0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  ndif../*.** Expa
1fcb0 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1fcc0 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1fcd0 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1fce0 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1fcf0 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1fd00 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1fd10 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1fd20 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1fd30 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1fd40 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1fd50 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1fd60 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1fd70 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1fd80 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1fd90 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1fda0 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1fdb0 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1fdc0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1fdd0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1fde0 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1fdf0 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1fe00 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
1fe10 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
1fe20 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
1fe30 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
1fe40 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
1fe50 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
1fe60 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
1fe70 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
1fe80 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
1fe90 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
1fea0 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
1feb0 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
1fec0 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
1fed0 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
1fee0 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
1fef0 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
1ff00 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
1ff10 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
1ff20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1ff30 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 74 68 65  ion fails or the
1ff40 20 53 72 63 4c 69 73 74 20 62 65 63 6f 6d 65 73   SrcList becomes
1ff50 20 74 6f 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76   too large, leav
1ff60 65 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61  e.** the origina
1ff70 6c 20 53 72 63 4c 69 73 74 20 75 6e 63 68 61 6e  l SrcList unchan
1ff80 67 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ged, return NULL
1ff90 2c 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  , and leave an e
1ffa0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
1ffb0 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72  in pParse..*/.Sr
1ffc0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1ffd0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
1ffe0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1fff0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20000 6e 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68  ntext into which
20010 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f   errors are repo
20020 72 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rted */.  SrcLis
20030 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
20040 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
20050 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
20060 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
20070 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20080 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
20090 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
200a0 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
200b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
200c0 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
200d0 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
200e0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
200f0 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
20100 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
20110 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
20120 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
20130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
20140 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
20150 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
20160 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
20170 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
20180 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
20190 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
201a0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
201b0 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
201c0 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
201d0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
201e0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
201f0 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
20200 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61  c->nSrc*2+nExtra
20210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
20220 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20230 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
20240 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49  Src+nExtra>=SQLI
20250 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29  TE_MAX_SRCLIST )
20260 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20270 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20280 22 74 6f 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63  "too many FROM c
20290 6c 61 75 73 65 20 74 65 72 6d 73 2c 20 6d 61 78  lause terms, max
202a0 3a 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  : %d",.         
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
202c0 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29  ITE_MAX_SRCLIST)
202d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
202e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
202f0 6e 41 6c 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41  nAlloc>SQLITE_MA
20300 58 5f 53 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c  X_SRCLIST ) nAll
20310 6f 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  oc = SQLITE_MAX_
20320 53 52 43 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65  SRCLIST;.    pNe
20330 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
20340 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
20360 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
20370 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
20380 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
20390 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
203a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
203b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
203c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
203d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
203e0 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  rc = pNew;.    p
203f0 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41  Src->nAlloc = nA
20400 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lloc;.  }..  /* 
20410 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c  Move existing sl
20420 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66  ots that come af
20430 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e  ter the newly in
20440 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a  serted slots.  *
20450 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  * out of the way
20460 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63   */.  for(i=pSrc
20470 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74  ->nSrc-1; i>=iSt
20480 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  art; i--){.    p
20490 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d  Src->a[i+nExtra]
204a0 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20   = pSrc->a[i];. 
204b0 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20   }.  pSrc->nSrc 
204c0 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  += nExtra;..  /*
204d0 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
204e0 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
204f0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
20500 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
20510 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
20520 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
20530 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
20540 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
20550 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
20560 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
20570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
20580 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
20590 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
205a0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
205b0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
205c0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
205d0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
205e0 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
205f0 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
20600 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
20610 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
20620 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
20630 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
20640 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
20650 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
20660 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
20670 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
20680 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  is an OOM error 
20690 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 53 72 63  or if the.** Src
206a0 4c 69 73 74 20 67 72 6f 77 73 20 74 6f 20 6c 61  List grows to la
206b0 72 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  rge.  The return
206c0 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
206d0 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
206e0 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
206f0 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
20700 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
20710 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
20720 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
20730 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
20740 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
20750 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
20760 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
20770 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
20780 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
20790 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
207a0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
207b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
207c0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
207d0 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
207e0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
207f0 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
20800 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
20810 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
20820 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
20830 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
20840 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
20850 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
20860 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
20870 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
20880 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
20890 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
208a0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
208b0 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
208c0 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
208d0 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
208e0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
208f0 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
20900 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
20910 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
20920 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
20930 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
20940 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
20950 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
20960 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
20970 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
20980 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
20990 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
209a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
209b0 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
209c0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
209d0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
209e0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
209f0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
20a00 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
20a10 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
20a20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
20a30 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
20a40 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
20a50 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
20a60 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
20a70 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
20a80 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
20a90 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
20aa0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
20ab0 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
20ac0 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
20ad0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
20ae0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20af0 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
20b00 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
20b10 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
20b20 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
20b30 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
20b40 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
20b50 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
20b60 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
20b70 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
20b80 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
20b90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20ba0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
20bb0 63 6f 6e 74 65 78 74 2c 20 69 6e 20 77 68 69 63  context, in whic
20bc0 68 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70  h errors are rep
20bd0 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69  orted */.  SrcLi
20be0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
20bf0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
20c00 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
20c10 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
20c20 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
20c30 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
20c40 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
20c50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
20c60 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
20c70 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
20c80 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
20c90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20ca0 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
20cb0 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
20cc0 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
20cd0 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
20ce0 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
20cf0 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
20d00 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20d20 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
20d30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20d40 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
20d50 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
20d60 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20d70 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
20d80 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
20d90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
20da0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20db0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
20dc0 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74  c = 1;.    pList
20dd0 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  ->nSrc = 1;.    
20de0 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
20df0 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [0], 0, sizeof(p
20e00 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
20e10 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43    pList->a[0].iC
20e20 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65  ursor = -1;.  }e
20e30 6c 73 65 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  lse{.    SrcList
20e40 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
20e50 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 70  SrcListEnlarge(p
20e60 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c  Parse, pList, 1,
20e70 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
20e80 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
20e90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
20ea0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
20eb0 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72   pList);.      r
20ec0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
20ed0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
20ee0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
20ef0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
20f00 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
20f10 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
20f20 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
20f30 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
20f40 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
20f50 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
20f60 73 65 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  se ){.    pItem-
20f70 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
20f80 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
20f90 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
20fa0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
20fb0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
20fc0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
20fd0 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
20fe0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
20ff0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21000 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
21010 6c 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  le);.    pItem->
21020 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
21030 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
21040 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
21050 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
21060 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
21070 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
21080 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
21090 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
210a0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
210b0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
210c0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
210d0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
210e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
210f0 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
21100 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
21110 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
21120 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
21130 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
21140 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
21150 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
21160 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
21170 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
21180 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
21190 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
211a0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
211b0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
211c0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
211d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
211e0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
211f0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
21200 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
21210 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
21220 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
21230 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
21240 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
21250 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
21260 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
21270 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
21280 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
21290 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
212a0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
212b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
212c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
212d0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
212e0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
212f0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
21300 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
21310 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
21320 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21330 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
21340 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
21350 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
21360 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
21370 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21380 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
21390 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
213a0 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
213b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
213c0 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  b, pItem->u1.zIn
213d0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66  dexedBy);.    if
213e0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
213f0 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45  bFunc ) sqlite3E
21400 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
21410 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
21420 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  cArg);.    sqlit
21430 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
21440 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
21450 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
21460 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
21470 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
21480 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
21490 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f  te(db, pItem->pO
214a0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
214b0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
214c0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
214d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
214e0 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
214f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
21500 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21510 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
21520 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
21530 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
21540 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
21550 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
21560 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
21570 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
21580 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
21590 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
215a0 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
215b0 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
215c0 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
215d0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
215e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
215f0 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
21600 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
21610 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
21620 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
21630 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
21640 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
21650 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
21660 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
21670 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
21680 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
21690 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
216a0 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
216b0 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68  has an alias, th
216c0 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73  en pAlias points
216d0 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73   to the.** alias
216e0 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20   token.  If the 
216f0 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65  term is a subque
21700 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65  ry, then pSubque
21710 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c  ry is the.** SEL
21720 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
21730 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
21740 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54  encodes.  The pT
21750 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74  able and.** pDat
21760 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73  abase parameters
21770 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75   are NULL for su
21780 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70  bqueries.  The p
21790 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a  On and pUsing.**
217a0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
217b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
217c0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
217d0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  clauses..**.** R
217e0 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c  eturn a new SrcL
217f0 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65  ist which encode
21800 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69  s is the FROM wi
21810 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65  th the new.** te
21820 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63  rm added..*/.Src
21830 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
21840 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
21850 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
21860 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
21870 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
21880 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
21890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
218a0 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f   The left part o
218b0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
218c0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a  e already seen *
218d0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
218e0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e,          /* N
218f0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
21900 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46   to add to the F
21910 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
21920 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
21930 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ,       /* Name 
21940 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21950 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c  containing pTabl
21960 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  e */.  Token *pA
21970 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f  lias,          /
21980 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
21990 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20   side of the AS 
219a0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
219b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
219c0 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20  uery,      /* A 
219d0 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e  subquery used in
219e0 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c   place of a tabl
219f0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
21a00 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20   *pOn,          
21a10 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c      /* The ON cl
21a20 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
21a30 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69  /.  IdList *pUsi
21a40 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng          /* T
21a50 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
21a60 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  of a join */.){.
21a70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
21a80 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
21a90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21aa0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
21ab0 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55  !p && (pOn || pU
21ac0 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  sing) ){.    sql
21ad0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21ae0 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61  rse, "a JOIN cla
21af0 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
21b00 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20  before %s", .   
21b10 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a     (pOn ? "ON" :
21b20 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b   "USING").    );
21b30 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
21b40 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
21b50 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72  .  p = sqlite3Sr
21b60 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
21b70 73 65 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70  se, p, pTable, p
21b80 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
21b90 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74   p==0 ){.    got
21ba0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
21bb0 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ror;.  }.  asser
21bc0 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a  t( p->nSrc>0 );.
21bd0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
21be0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
21bf0 73 65 72 74 28 20 28 70 54 61 62 6c 65 3d 3d 30  sert( (pTable==0
21c00 29 3d 3d 28 70 44 61 74 61 62 61 73 65 3d 3d 30  )==(pDatabase==0
21c10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21c20 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c  Item->zName==0 |
21c30 7c 20 70 44 61 74 61 62 61 73 65 21 3d 30 20 29  | pDatabase!=0 )
21c40 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  ;.  if( IN_RENAM
21c50 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65  E_OBJECT && pIte
21c60 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
21c70 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20  Token *pToken = 
21c80 28 41 4c 57 41 59 53 28 70 44 61 74 61 62 61 73  (ALWAYS(pDatabas
21c90 65 29 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  e) && pDatabase-
21ca0 3e 7a 29 20 3f 20 70 44 61 74 61 62 61 73 65 20  >z) ? pDatabase 
21cb0 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  : pTable;.    sq
21cc0 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
21cd0 4d 61 70 28 70 50 61 72 73 65 2c 20 70 49 74 65  Map(pParse, pIte
21ce0 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e  m->zName, pToken
21cf0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
21d00 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
21d10 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
21d20 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
21d30 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
21d40 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
21d50 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
21d60 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
21d70 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
21d80 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
21d90 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
21da0 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
21db0 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
21dc0 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
21dd0 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
21de0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
21df0 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
21e00 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
21e10 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
21e20 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
21e30 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
21e40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21e50 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
21e60 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
21e70 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
21e80 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
21e90 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
21ea0 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
21eb0 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
21ec0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
21ed0 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
21ee0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
21ef0 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
21f00 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
21f10 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
21f20 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
21f30 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
21f40 0a 20 20 69 66 28 20 70 20 26 26 20 70 49 6e 64  .  if( p && pInd
21f50 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20  exedBy->n>0 ){. 
21f60 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21f70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21f80 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53     assert( p->nS
21f90 72 63 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  rc>0 );.    pIte
21fa0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
21fb0 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  c-1];.    assert
21fc0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49  ( pItem->fg.notI
21fd0 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ndexed==0 );.   
21fe0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
21ff0 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d  fg.isIndexedBy==
22000 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
22010 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
22020 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Func==0 );.    i
22030 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
22040 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
22050 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
22060 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
22070 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
22080 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
22090 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
220a0 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
220b0 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
220c0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
220d0 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
220e0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
220f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e        pItem->u1.
22100 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c  zIndexedBy = sql
22110 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
22120 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
22130 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20  ndexedBy);.     
22140 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
22150 65 78 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20  exedBy = 1;.    
22160 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
22170 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
22180 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
22190 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
221a0 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
221b0 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
221c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
221d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
221e0 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
221f0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
22200 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
22210 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
22220 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22230 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
22240 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
22250 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
22260 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
22270 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
22280 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
22290 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
222a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
222b0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
222c0 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
222d0 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
222e0 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
222f0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
22300 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
22310 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
22320 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
22330 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
22340 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
22350 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
22360 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
22370 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
22380 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
22390 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
223a0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
223b0 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
223c0 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
223d0 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
223e0 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
223f0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
22400 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
22410 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
22420 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
22430 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
22440 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
22450 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
22460 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
22470 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
22480 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
22490 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
224a0 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
224b0 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
224c0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
224d0 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
224e0 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
224f0 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
22500 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
22510 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
22520 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
22530 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
22540 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
22550 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
22560 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22570 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
22580 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
22590 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
225a0 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
225b0 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
225c0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
225d0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
225e0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
225f0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
22600 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
22610 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
22620 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
22630 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
22640 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
22650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22660 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
22670 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
22680 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
22690 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
226a0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
226b0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
226c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
226d0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
226e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
226f0 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
22700 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
22710 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
22720 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
22730 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22740 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
22750 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
22760 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
22770 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
22780 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
22790 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
227a0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
227b0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
227c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
227d0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
227e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
227f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
22800 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
22810 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
22820 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
22830 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
22840 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
22850 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
22860 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp0(v, OP_AutoC
22870 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ommit);.}../*.**
22880 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
22890 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ode for a COMMIT
228a0 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61   or ROLLBACK sta
228b0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20  tement..** Code 
228c0 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20  for ROLLBACK is 
228d0 67 65 6e 65 72 61 74 65 64 20 69 66 20 65 54 79  generated if eTy
228e0 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e  pe==TK_ROLLBACK.
228f0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63    Otherwise.** c
22900 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
22910 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a   for a COMMIT..*
22920 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
22930 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  dTransaction(Par
22940 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
22950 65 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a  eType){.  Vdbe *
22960 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62  v;.  int isRollb
22970 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ack;..  assert( 
22980 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
22990 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
229a0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
229b0 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d  ( eType==TK_COMM
229c0 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f  IT || eType==TK_
229d0 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  END || eType==TK
229e0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69  _ROLLBACK );.  i
229f0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70  sRollback = eTyp
22a00 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  e==TK_ROLLBACK;.
22a10 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
22a20 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
22a30 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
22a40 4e 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c  N, .       isRol
22a50 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43  lback ? "ROLLBAC
22a60 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30  K" : "COMMIT", 0
22a70 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
22a80 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
22a90 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
22aa0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
22ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22ac0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
22ad0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f  oCommit, 1, isRo
22ae0 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  llback);.  }.}..
22af0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
22b00 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
22b10 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e   the parser when
22b20 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d   it parses a com
22b30 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a  mand to create,.
22b40 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  ** release or ro
22b50 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61  llback an SQL sa
22b60 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69  vepoint. .*/.voi
22b70 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69  d sqlite3Savepoi
22b80 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nt(Parse *pParse
22b90 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20  , int op, Token 
22ba0 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
22bb0 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
22bc0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
22bd0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
22be0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
22bf0 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
22c00 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
22c10 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
22c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
22c30 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61  RIZATION.    sta
22c40 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
22c50 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20   const az[] = { 
22c60 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53  "BEGIN", "RELEAS
22c70 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d  E", "ROLLBACK" }
22c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53  ;.    assert( !S
22c90 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26  AVEPOINT_BEGIN &
22ca0 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  & SAVEPOINT_RELE
22cb0 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f  ASE==1 && SAVEPO
22cc0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20  INT_ROLLBACK==2 
22cd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
22ce0 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41  ( !v || sqlite3A
22cf0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
22d00 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e   SQLITE_SAVEPOIN
22d10 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65  T, az[op], zName
22d20 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
22d30 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
22d40 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
22d50 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
22d60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
22d70 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
22d80 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30  Savepoint, op, 0
22d90 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44  , 0, zName, P4_D
22da0 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
22db0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
22dc0 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
22dd0 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76  e is open and av
22de0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e  ailable for use.
22df0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
22e00 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
22e10 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  .  Leave any err
22e20 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74  or messages in t
22e30 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
22e40 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
22e50 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
22e60 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
22e70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
22e80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22e90 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
22ea0 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
22eb0 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
22ec0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
22ed0 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73  tree *pBt;.    s
22ee0 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
22ef0 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20  flags = .       
22f00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
22f10 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20  EADWRITE |.     
22f20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22f30 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
22f40 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22f50 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
22f60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22f70 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
22f80 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
22f90 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
22fa0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
22fb0 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
22fc0 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42  pVfs, 0, db, &pB
22fd0 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20  t, 0, flags);.  
22fe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
23000 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23010 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
23020 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
23030 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
23040 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
23050 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
23060 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
23070 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
23080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
23090 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
230a0 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b  Db[1].pBt = pBt;
230b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
230c0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
230d0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
230e0 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33  E_NOMEM==sqlite3
230f0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
23100 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61  (pBt, db->nextPa
23110 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29  gesize, -1, 0) )
23120 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
23130 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
23140 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
23150 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23160 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  0;.}../*.** Reco
23170 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
23180 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
23190 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ie will need to 
231a0 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66  be verified.** f
231b0 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  or database iDb.
231c0 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63    The code to ac
231d0 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68  tually verify th
231e0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a  e schema cookie.
231f0 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74  ** will occur at
23200 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23210 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61  top-level VDBE a
23220 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  nd will be gener
23230 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62  ated.** later, b
23240 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  y sqlite3FinishC
23250 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
23260 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23270 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
23280 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
23290 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
232a0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
232b0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
232c0 73 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  se);..  assert( 
232d0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50  iDb>=0 && iDb<pP
232e0 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
232f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
23300 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
23310 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
23320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
23330 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
23340 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73  ACHED+2 );.  ass
23350 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
23360 6d 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72  maMutexHeld(pPar
23370 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20  se->db, iDb, 0) 
23380 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54  );.  if( DbMaskT
23390 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  est(pToplevel->c
233a0 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d  ookieMask, iDb)=
233b0 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  =0 ){.    DbMask
233c0 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  Set(pToplevel->c
233d0 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b  ookieMask, iDb);
233e0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
233f0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
23400 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23410 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
23420 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
23430 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23440 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20  If argument zDb 
23450 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61  is NULL, then ca
23460 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  ll sqlite3CodeVe
23470 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72  rifySchema() for
23480 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68   each .** attach
23490 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68  ed database. Oth
234a0 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69  erwise, invoke i
234b0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
234c0 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c  se named zDb onl
234d0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
234e0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
234f0 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  dSchema(Parse *p
23500 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
23510 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74  r *zDb){.  sqlit
23520 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
23530 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
23540 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
23550 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
23560 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
23570 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
23580 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c  ->pBt && (!zDb |
23590 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  | 0==sqlite3StrI
235a0 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44  Cmp(zDb, pDb->zD
235b0 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20  bSName)) ){.    
235c0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
235d0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
235e0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
235f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
23600 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
23610 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
23620 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
23630 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
23640 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
23650 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
23660 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
23670 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
23680 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
23690 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
236a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
236b0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
236c0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
236d0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
236e0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
236f0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
23700 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
23710 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
23720 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
23730 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
23740 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
23750 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
23760 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
23770 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
23780 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
23790 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
237a0 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
237b0 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
237c0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
237d0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
237e0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
237f0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
23800 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
23810 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
23820 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
23830 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
23840 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
23850 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
23860 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
23870 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
23880 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
23890 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
238a0 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
238b0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
238c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
238d0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
238e0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
238f0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
23900 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
23910 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
23920 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
23930 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
23940 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28  b);.  DbMaskSet(
23950 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
23960 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54  Mask, iDb);.  pT
23970 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
23980 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74  Write |= setStat
23990 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ement;.}../*.** 
239a0 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  Indicate that th
239b0 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
239c0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
239d0 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77  truction might w
239e0 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  rite.** more tha
239f0 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61  n one entry (exa
23a00 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f  mple: deleting o
23a10 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65  ne row then inse
23a20 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a  rting another,.*
23a30 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74  * inserting mult
23a40 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74  iple rows in a t
23a50 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69  able, or inserti
23a60 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64  ng a row and ind
23a70 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20  ex entries.).** 
23a80 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75  If an abort occu
23a90 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66  rs after some of
23aa0 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61   these writes ha
23ab0 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68  ve completed, th
23ac0 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65  en it will.** be
23ad0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
23ae0 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64  do the completed
23af0 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64   writes..*/.void
23b00 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
23b10 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
23b20 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
23b30 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
23b40 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
23b50 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
23b60 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
23b70 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  = 1;.}../* .** T
23b80 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
23b90 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
23ba0 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f  tine if is disco
23bb0 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a  vers that it is.
23bc0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ** possible to a
23bd0 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  bort a statement
23be0 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65   prior to comple
23bf0 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20  tion.  In order 
23c00 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74  to .** perform t
23c10 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75  his abort withou
23c20 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  t corrupting the
23c30 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65   database, we ne
23c40 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75  ed to make.** su
23c50 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  re that the stat
23c60 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74  ement is protect
23c70 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e  ed by a statemen
23c80 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
23c90 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79  *.** Technically
23ca0 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  , we only need t
23cb0 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f  o set the mayAbo
23cc0 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a  rt flag if the.*
23cd0 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66  * isMultiWrite f
23ce0 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73  lag was previous
23cf0 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69  ly set.  There i
23d00 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65  s a time depende
23d10 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74  ncy.** such that
23d20 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20   the abort must 
23d30 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20  occur after the 
23d40 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69  multiwrite.  Thi
23d50 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20  s makes.** some 
23d60 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c  statements invol
23d70 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45  ving the REPLACE
23d80 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
23d90 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a  tion algorithm.*
23da0 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61  * go a little fa
23db0 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e  ster.  But takin
23dc0 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  g advantage of t
23dd0 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65  his time depende
23de0 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20  ncy.** makes it 
23df0 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74  more difficult t
23e00 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  o prove that the
23e10 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74   code is correct
23e20 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75   (in .** particu
23e30 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73  lar, it prevents
23e40 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67   us from writing
23e50 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a   an effective.**
23e60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
23e70 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  of sqlite3Assert
23e80 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20  MayAbort()) and 
23e90 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65  so we have chose
23ea0 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65  n.** to take the
23eb0 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20   safe route and 
23ec0 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a  skip the optimiz
23ed0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
23ee0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50  qlite3MayAbort(P
23ef0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
23f00 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
23f10 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
23f20 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
23f30 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d  ;.  pToplevel->m
23f40 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a  ayAbort = 1;.}..
23f50 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
23f60 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65  _Halt that cause
23f70 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65  s the vdbe to re
23f80 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
23f90 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72  ONSTRAINT.** err
23fa0 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20  or. The onError 
23fb0 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
23fc0 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61  ines which (if a
23fd0 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65  ny) of the state
23fe0 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63  ment.** and/or c
23ff0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
24000 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
24010 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
24020 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
24030 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24040 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
24050 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
24060 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20  t errCode,      
24070 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f  /* extended erro
24080 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
24090 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
240a0 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
240b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20   */.  char *p4, 
240c0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
240d0 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38   message */.  i8
240e0 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
240f0 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20  /* P4_STATIC or 
24100 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a  P4_TRANSIENT */.
24110 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20    u8 p5Errmsg   
24120 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67      /* P5_ErrMsg
24130 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   type */.){.  Vd
24140 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
24150 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
24160 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f    assert( (errCo
24170 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  de&0xff)==SQLITE
24180 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
24190 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
241a0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71  _Abort ){.    sq
241b0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
241c0 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
241d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
241e0 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f  , OP_Halt, errCo
241f0 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  de, onError, 0, 
24200 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73  p4, p4type);.  s
24210 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
24220 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
24230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
24240 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
24250 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
24260 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
24270 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
24280 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
24290 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
242a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
242b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
242c0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
242d0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
242e0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
242f0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
24300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
24310 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
24320 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
24330 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
24340 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
24350 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
24360 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
24370 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
24380 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
24390 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50  Init(&errMsg, pP
243a0 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  arse->db, 0, 0, 
243b0 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78  200);.  if( pIdx
243c0 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20  ->aColExpr ){.  
243d0 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
243e0 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22  pendf(&errMsg, "
243f0 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64  index '%q'", pId
24400 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  x->zName);.  }el
24410 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  se{.    for(j=0;
24420 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
24430 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; j++){.      ch
24440 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
24450 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
24460 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
24470 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
24480 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  b->aCol[pIdx->ai
24490 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
244a0 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20  ;.      if( j ) 
244b0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
244c0 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22  nd(&errMsg, ", "
244d0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
244e0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c  te3_str_appendal
244f0 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d  l(&errMsg, pTab-
24500 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
24510 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
24520 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20  d(&errMsg, ".", 
24530 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
24540 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
24550 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a  &errMsg, zCol);.
24560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72      }.  }.  zErr
24570 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
24580 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
24590 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
245a0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
245b0 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72  e, .    IsPrimar
245c0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
245d0 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ? SQLITE_CONSTRA
245e0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a  INT_PRIMARYKEY .
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51              : SQ
24610 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
24620 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72  UNIQUE,.    onEr
24630 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  ror, zErr, P4_DY
24640 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72  NAMIC, P5_Constr
24650 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
24660 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
24670 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f  P_Halt due to no
24680 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a  n-unique rowid..
24690 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
246a0 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a  owidConstraint(.
246b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
246c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
246d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
246e0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
246f0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
24700 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a  tion algorithm *
24710 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
24720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
24730 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d  le with the non-
24740 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20  unique rowid */ 
24750 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
24760 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
24770 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
24780 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73   ){.    zMsg = s
24790 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
247a0 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73  arse->db, "%s.%s
247b0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
247e0 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
247f0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ].zName);.    rc
24800 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
24810 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b  AINT_PRIMARYKEY;
24820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
24830 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
24840 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
24850 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62  "%s.rowid", pTab
24860 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ->zName);.    rc
24870 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
24880 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a  AINT_ROWID;.  }.
24890 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
248a0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
248b0 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73  rc, onError, zMs
248c0 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20  g, P4_DYNAMIC,. 
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
248f0 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
24900 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
24910 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
24920 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
24930 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
24940 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
24950 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
24960 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
24970 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
24980 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
24990 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
249a0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
249b0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
249c0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
249d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
249e0 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
249f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
24a00 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
24a10 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
24a20 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
24a30 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61  azColl[i];.    a
24a40 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70  ssert( z!=0 || p
24a50 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
24a60 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i]<0 );.    if( 
24a70 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
24a80 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c  [i]>=0 && 0==sql
24a90 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
24aa0 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
24ab0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
24ac0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
24ad0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24ae0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
24af0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
24b00 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
24b10 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
24b20 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
24b30 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
24b40 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
24b50 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
24b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
24b70 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
24b80 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
24b90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
24ba0 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
24bb0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
24bc0 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
24bd0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 49 6e 64  pTab) ){.    Ind
24be0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
24bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
24c00 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
24c10 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
24c20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
24c30 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
24c40 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
24c50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
24c60 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
24c70 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
24c80 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
24c90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62  .        int iDb
24ca0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
24cb0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
24cc0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
24cd0 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  a);.        sqli
24ce0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
24cf0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
24d00 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
24d10 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
24d20 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
24d30 78 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  x, -1);.      }.
24d40 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
24d50 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
24d60 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
24d70 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
24d80 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
24d90 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
24da0 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
24db0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
24dc0 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
24dd0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
24de0 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
24df0 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
24e00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24e10 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
24e20 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
24e30 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
24e40 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
24e50 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
24e60 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
24e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
24e80 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
24e90 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24ec0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
24ed0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24ee0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
24ef0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
24f00 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
24f10 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
24f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
24f30 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
24f40 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
24f50 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f70 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
24f80 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73  atabase */..  as
24f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
24fa0 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
24fb0 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65  s(db) );  /* Nee
24fc0 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  ded for schema a
24fd0 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69  ccess */.  for(i
24fe0 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
24ff0 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
25000 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
25010 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
25020 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
25030 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
25040 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
25050 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
25060 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
25070 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
25080 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
25090 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
250a0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
250b0 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
250c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
250d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
250e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
250f0 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
25100 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
25110 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
25140 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
25150 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
25160 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
25170 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
25180 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
25190 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
251a0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
251b0 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
251c0 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
251d0 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
251e0 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
251f0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
25200 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
25210 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
25220 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
25230 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
25240 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
25250 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
25260 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
25270 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
25280 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
25290 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
252a0 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
252b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
252c0 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
252d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
252e0 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
252f0 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
25300 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
25310 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
25320 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
25330 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
25340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
25350 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
25360 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
25370 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
25380 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
25390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
253a0 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
253b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
253c0 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
253d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
253e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
253f0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
25400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25410 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
25420 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
25430 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25450 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
25460 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
25470 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25490 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
254a0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
254b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
254c0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
254d0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
254e0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
254f0 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
25500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
25510 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
25520 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
25530 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
25540 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
25550 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
25560 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
25570 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
25580 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
25590 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
255a0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
255b0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
255c0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
255d0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
255e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
255f0 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
25600 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
25610 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
25620 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
25630 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45    }else if( NEVE
25640 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20  R(pName2==0) || 
25650 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
25660 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
25670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
25680 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
25690 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
256a0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
256b0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
256c0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
256d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
256e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
256f0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
25700 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
25710 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
25720 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61  .      reindexDa
25730 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
25740 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  zColl);.      sq
25750 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25760 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  zColl);.      re
25770 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
25780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25790 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zColl);.  }.  
257a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
257b0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
257c0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
257d0 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
257e0 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
257f0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
25800 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
25810 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
25820 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
25830 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
25840 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
25850 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
25860 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
25870 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
25880 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
25890 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
258a0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
258b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
258c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
258d0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
258e0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
258f0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
25900 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25910 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
25920 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
25930 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
25940 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
25950 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
25960 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
25970 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
25980 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25990 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
259a0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
259b0 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
259c0 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
259d0 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
259e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
259f0 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  rn a KeyInfo str
25a00 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61  ucture that is a
25a10 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
25a20 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a  he given Index..
25a30 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
25a40 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
25a50 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
25a60 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75  ef() on the retu
25a70 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77  rned object.** w
25a80 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73  hen it has finis
25a90 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f  hed using it..*/
25aa0 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
25ab0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
25ac0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
25ad0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
25ae0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
25af0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
25b00 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70  ;.  int nKey = p
25b10 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
25b20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20  KeyInfo *pKey;. 
25b30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
25b40 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
25b50 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  if( pIdx->uniqNo
25b60 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65  tNull ){.    pKe
25b70 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
25b80 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
25b90 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e  db, nKey, nCol-n
25ba0 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
25bb0 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
25bc0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
25bd0 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20  arse->db, nCol, 
25be0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b  0);.  }.  if( pK
25bf0 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
25c00 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
25c10 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
25c20 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
25c30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
25c40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25c50 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
25c60 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
25c70 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
25c80 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33  = zColl==sqlite3
25c90 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a  StrBINARY ? 0 :.
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
25cc0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
25cd0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
25ce0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
25cf0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
25d00 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
25d10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
25d20 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
25d30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
25d40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ->rc==SQLITE_ERR
25d50 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53  OR_MISSING_COLLS
25d60 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  EQ );.      if( 
25d70 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d  pIdx->bNoQuery==
25d80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
25d90 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69  Deactivate the i
25da0 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20  ndex because it 
25db0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e  contains an unkn
25dc0 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  own collating.  
25dd0 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63        ** sequenc
25de0 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  e.  The only way
25df0 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65   to reactive the
25e00 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c   index is to rel
25e10 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  oad the.        
25e20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69  ** schema.  Addi
25e30 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63  ng the missing c
25e40 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
25e50 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74  e later does not
25e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63  .        ** reac
25e70 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20  tive the index. 
25e80 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   The application
25e90 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20   had the chance 
25ea0 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20  to register.    
25eb0 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69      ** the missi
25ec0 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  ng index using t
25ed0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65  he collation-nee
25ee0 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46  ded callback.  F
25ef0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  or.        ** si
25f00 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65  mplicity, SQLite
25f10 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74   will not give t
25f20 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61  he application a
25f30 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a   second chance..
25f40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25f50 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72     pIdx->bNoQuer
25f60 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
25f70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
25f80 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a  TE_ERROR_RETRY;.
25f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
25fa0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
25fb0 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
25fc0 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
25fd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
25fe0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
25ff0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
26000 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26010 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
26020 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
26030 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
26040 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
26050 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
26060 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
26070 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
26080 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
26090 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
260a0 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
260b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
260c0 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
260d0 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
260e0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
260f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
26100 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
26110 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
26120 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
26130 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
26140 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
26150 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
26160 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
26170 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
26180 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
26190 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
261a0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
261b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
261c0 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
261d0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
261e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
261f0 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
26200 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
26210 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
26220 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
26230 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
26240 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
26250 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
26260 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
26270 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
26280 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
26290 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
262a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
262b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
262c0 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
262d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
262e0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
262f0 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
26300 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
26310 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26320 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
26330 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
26340 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
26350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26360 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
26370 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
26380 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  e = sizeof(*pWit
26390 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69  h) + (sizeof(pWi
263a0 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74  th->a[1]) * pWit
263b0 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e  h->nCte);.    pN
263c0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
263d0 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c  alloc(db, pWith,
263e0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
263f0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  {.    pNew = sql
26400 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
26410 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69  (db, sizeof(*pWi
26420 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  th));.  }.  asse
26430 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20  rt( (pNew!=0 && 
26440 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d  zName!=0) || db-
26450 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
26460 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
26470 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
26480 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
26490 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
264a0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
264b0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
264c0 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
264d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
264e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
264f0 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
26500 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
26510 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
26520 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
26530 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
26540 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
26550 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
26560 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
26570 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
26580 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
26590 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20  nCte].zCteErr = 
265a0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
265b0 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
265c0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
265d0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
265e0 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
265f0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
26600 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
26610 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
26620 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
26630 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
26640 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
26650 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
26660 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
26670 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
26680 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
26690 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
266a0 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
266b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
266c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
266d0 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
266e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
266f0 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
26700 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
26710 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
26720 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
26730 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26740 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
26750 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
26760 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
26770 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
26780 0a                                               .