/ Hex Artifact Content
Login

Artifact 0860029ca6e29b2bfcadbbe90084e02af98d768f:


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 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 35 31 39 20 32 30 30 39 2f 30 32 2f 31 39  1.519 2009/02/19
02f0: 20 31 34 3a 33 39 3a 32 35 20 64 61 6e 69 65 6c   14:39:25 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  nt.h"../*.** Thi
0330: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0340: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53  led when a new S
0350: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
0360: 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20  beginning to.** 
0370: 62 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74  be parsed.  Init
0380: 69 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73  ialize the pPars
0390: 65 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e  e structure as n
03a0: 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eeded..*/.void s
03b0: 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65  qlite3BeginParse
03c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
03d0: 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29  int explainFlag)
03e0: 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  {.  pParse->expl
03f0: 61 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69  ain = (u8)explai
0400: 6e 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d  nFlag;.  pParse-
0410: 3e 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69  >nVar = 0;.}..#i
0420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0430: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
0440: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f  *.** The TableLo
0450: 63 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ck structure is 
0460: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
0470: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0480: 6b 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54  k() and.** codeT
0490: 61 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63  ableLocks() func
04a0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  tions..*/.struct
04b0: 20 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69   TableLock {.  i
04c0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
04d0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
04e0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
04f0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
0500: 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ocked */.  int i
0510: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
0520: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
0530: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
0540: 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
0550: 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20  u8 isWriteLock; 
0560: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
0570: 20 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61   write lock.  Fa
0580: 6c 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c  lse for a read l
0590: 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ock */.  const c
05a0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
05b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
05c0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
05d0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
05e0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
05f0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
0600: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
0610: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
0620: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0630: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0640: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0650: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0660: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0670: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0680: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0690: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
06a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
06b0: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
06c0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
06d0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
06e0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
06f0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
0700: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
0710: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
0720: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0730: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0740: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0750: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0760: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0770: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0780: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0790: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
07a0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
07b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
07c0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
07d0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
07f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
0800: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
0810: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
0820: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0830: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0840: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0850: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0860: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0870: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0880: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0890: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
08a0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
08b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b 0a 20  .  int nBytes;. 
08c0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b 0a 0a   TableLock *p;..
08d0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
08e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
08f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0900: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0910: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
0920: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0930: 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ck[i];.    if( p
0940: 2d 3e 69 44 62 3d 3d 69 44 62 20 26 26 20 70 2d  ->iDb==iDb && p-
0950: 3e 69 54 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20  >iTab==iTab ){. 
0960: 20 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c       p->isWriteL
0970: 6f 63 6b 20 3d 20 28 70 2d 3e 69 73 57 72 69 74  ock = (p->isWrit
0980: 65 4c 6f 63 6b 20 7c 7c 20 69 73 57 72 69 74 65  eLock || isWrite
0990: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74  Lock);.      ret
09a0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
09b0: 20 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f    nBytes = sizeo
09c0: 66 28 54 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28  f(TableLock) * (
09d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
09e0: 63 6b 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d  ck+1);.  pParse-
09f0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 0a 20  >aTableLock = . 
0a00: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
0a10: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
0a20: 73 65 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  se->db, pParse->
0a30: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0a40: 65 73 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  es);.  if( pPars
0a50: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 29 7b  e->aTableLock ){
0a60: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
0a70: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 50 61  ->aTableLock[pPa
0a80: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  rse->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
0b10: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  k = 0;.    pPars
0b20: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
0b30: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  led = 1;.  }.}..
0b40: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
0b50: 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72  _TableLock instr
0b60: 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  uction for each 
0b70: 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20  table locked by 
0b80: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
0b90: 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20   (configured by 
0ba0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
0bb0: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f  TableLock())..*/
0bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
0bd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73  eTableLocks(Pars
0be0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
0bf0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64  t i;.  Vdbe *pVd
0c00: 62 65 3b 20 0a 0a 20 20 69 66 28 20 30 3d 3d 28  be; ..  if( 0==(
0c10: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47  pVdbe = sqlite3G
0c20: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 20  etVdbe(pParse)) 
0c30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
0c40: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   }..  for(i=0; i
0c50: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c  <pParse->nTableL
0c60: 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  ock; i++){.    T
0c70: 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20 26 70  ableLock *p = &p
0c80: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0c90: 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 70 31  k[i];.    int p1
0ca0: 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20 20 73   = p->iDb;.    s
0cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
0cc0: 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65  (pVdbe, OP_Table
0cd0: 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61  Lock, p1, p->iTa
0ce0: 62 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  b, p->isWriteLoc
0cf0: 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
0d00: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
0d10: 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  e, P4_STATIC);. 
0d20: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65   }.}.#else.  #de
0d30: 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f  fine codeTableLo
0d40: 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  cks(x).#endif../
0d50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0d60: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
0d70: 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73  r a single SQL s
0d80: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65  tatement has bee
0d90: 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20  n.** parsed and 
0da0: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74  a VDBE program t
0db0: 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20 73  o execute that s
0dc0: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65  tatement has bee
0dd0: 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20  n.** prepared.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74  This routine put
0df0: 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20  s the finishing 
0e00: 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a  touches on the.*
0e10: 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61  * VDBE program a
0e20: 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70 50  nd resets the pP
0e30: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 66  arse structure f
0e40: 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70  or the next.** p
0e50: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  arse..**.** Note
0e60: 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f   that if an erro
0e70: 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d  r occurred, it m
0e80: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
0e90: 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45   that.** no VDBE
0ea0: 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61   code was genera
0eb0: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
0ec0: 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
0ed0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
0ee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0ef0: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 64 62    Vdbe *v;..  db
0f00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0f10: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
0f20: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0f30: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0f40: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  sted ) return;. 
0f50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
0f60: 72 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  r ) return;..  /
0f70: 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72  * Begin by gener
0f80: 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69  ating some termi
0f90: 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74  nation code at t
0fa0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
0fb0: 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a  ** vdbe program.
0fc0: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
0fd0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
0fe0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
0ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1000: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
1010: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
1020: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
1030: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
1040: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
1050: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
1060: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
1070: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
1080: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
1090: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
10a0: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
10b0: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
10c0: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
10d0: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
10e0: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
10f0: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
1100: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
1110: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
1120: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
1130: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
1140: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1150: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1160: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b  >cookieGoto>0 ){
1170: 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b  .      u32 mask;
1180: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  .      int iDb;.
1190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11a0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61  eJumpHere(v, pPa
11b0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d  rse->cookieGoto-
11c0: 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44  1);.      for(iD
11d0: 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62  b=0, mask=1; iDb
11e0: 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c  <db->nDb; mask<<
11f0: 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  =1, iDb++){.    
1200: 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
1210: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1220: 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  sk)==0 ) continu
1230: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1240: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1250: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  v, iDb);.       
1260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1270: 70 32 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74  p2(v,OP_Transact
1280: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
1290: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
12a0: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
12b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12c0: 4f 70 32 28 76 2c 4f 50 5f 56 65 72 69 66 79 43  Op2(v,OP_VerifyC
12d0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
12e0: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
12f0: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iDb]);.      }.#
1300: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1310: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1320: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1330: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
1340: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
1350: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b  ->nVtabLock; i++
1360: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
1370: 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20  r *vtab = (char 
1380: 2a 29 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62  *)pParse->apVtab
1390: 4c 6f 63 6b 5b 69 5d 2d 3e 70 56 74 61 62 3b 0a  Lock[i]->pVtab;.
13a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13b0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13c0: 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20  P_VBegin, 0, 0, 
13d0: 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42  0, vtab, P4_VTAB
13e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
1400: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  abLock = 0;.    
1410: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1420: 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68    /* Once all th
1430: 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62  e cookies have b
1440: 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64  een verified and
1450: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70   transactions op
1460: 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20  ened, .      ** 
1470: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
1480: 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e  red table-locks.
1490: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
14a0: 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20   unless the .   
14b0: 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63     ** shared-cac
14c0: 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e  he feature is en
14d0: 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  abled..      */.
14e0: 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c        codeTableL
14f0: 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20  ocks(pParse);.  
1500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1510: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1520: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
1530: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
1540: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
1550: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
1560: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
1570: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
1580: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
1590: 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  ==0 && !db->mall
15a0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64  ocFailed ){.#ifd
15b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15c0: 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20      FILE *trace 
15d0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
15e0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29  QLITE_VdbeTrace)
15f0: 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30  !=0 ? stdout : 0
1600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1610: 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29  eTrace(v, trace)
1620: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
1630: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
1640: 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20  ableColCache==0 
1650: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1660: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1670: 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c 69  atch */.    sqli
1680: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
1690: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
16a0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a  , pParse->nMem,.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
16d0: 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d 3e 65  >nTab, pParse->e
16e0: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
16f0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1700: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
1710: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1720: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1730: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
1740: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
1750: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1760: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1770: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
1780: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
1790: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
17a0: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
17b0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50  ->nVar = 0;.  pP
17c0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
17d0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
17e0: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
17f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1800: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1810: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1820: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1830: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1840: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1850: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1860: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1870: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1880: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1890: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18a0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
18b0: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
18c0: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
18d0: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
18e0: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
18f0: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1900: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1910: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1920: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1930: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1940: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1950: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1960: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1970: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1980: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1990: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
19a0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
19b0: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
19c0: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
19d0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
19e0: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
19f0: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1a00: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1a10: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1a20: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1a30: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1a40: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a50: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1a60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1a70: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1a80: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1a90: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1aa0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1ab0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
1ac0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ad0: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
1ae0: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1af0: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1b00: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1b10: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1b20: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1b30: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1b40: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1b50: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1b60: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1b70: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1b80: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1b90: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1ba0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1bb0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1bc0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
1bd0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1be0: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1bf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c00: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1c10: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c20: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1c30: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1c40: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1c50: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1c60: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1c70: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1c80: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1c90: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1ca0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
1cb0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1cc0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1cd0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1ce0: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
1cf0: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1d00: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1d10: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1d20: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1d40: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1d50: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1d60: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1d70: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1d80: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1d90: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1da0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1db0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1dc0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1dd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1de0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1df0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1e10: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1e20: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1e30: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1e40: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1e50: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1e60: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1e70: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1e80: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1e90: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1ea0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1eb0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1ec0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1ed0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1ee0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1ef0: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1f00: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1f10: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f20: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1f30: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
1f40: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1f50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1f60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1f70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1f80: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
1f90: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1fa0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
1fb0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1fc0: 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  0 );.  nName = s
1fd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c  qlite3Strlen(db,
1fe0: 20 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 66   zName) + 1;.  f
1ff0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2000: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2010: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2020: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2030: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2040: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2050: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2060: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2070: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2080: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2090: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
20a0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
20b0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
20c0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
20d0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
20e0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
20f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2100: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2110: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2120: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2130: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2140: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2150: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2160: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2170: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2180: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2190: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
21a0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
21b0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
21c0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
21d0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
21e0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
21f0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2200: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2210: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2220: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2230: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2240: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2250: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2260: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2270: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2280: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2290: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
22a0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
22b0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
22c0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
22d0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
22e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
22f0: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2300: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2310: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2320: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2330: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2340: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2350: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2360: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2370: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2380: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2390: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
23a0: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
23b0: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
23c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
23d0: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
23e0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
23f0: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2400: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2410: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2420: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2430: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2440: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2450: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2460: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2470: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2480: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2490: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
24a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
24b0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
24c0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
24d0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
24e0: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
24f0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2500: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2510: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2520: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2530: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2540: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2550: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2560: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2570: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
2580: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
2590: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
25a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25b0: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
25c0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
25d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
25e0: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
25f0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2600: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2610: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2620: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2630: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2640: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2650: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2660: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2670: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2680: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2690: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
26a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
26b0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
26c0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
26d0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
26e0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
26f0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2700: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2710: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2720: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2730: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2740: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2750: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2760: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2770: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2780: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2790: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
27a0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
27b0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
27c0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
27d0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
27e0: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
27f0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2800: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2810: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2820: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2830: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2840: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2850: 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 2b 31 3b  en(db, zName)+1;
2860: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2870: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2880: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2890: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
28a0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
28b0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
28c0: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
28d0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
28e0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
28f0: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
2900: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
2910: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2920: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2930: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
2940: 61 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64  a || (j==1 && !d
2950: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
2960: 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d  ;.    if( pSchem
2970: 61 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73  a ){.      p = s
2980: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2990: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
29a0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
29b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
29d0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
29e0: 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  ** Reclaim the m
29f0: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e  emory used by an
2a00: 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63   index.*/.static
2a10: 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28   void freeIndex(
2a20: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c  Index *p){.  sql
2a30: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 54  ite3 *db = p->pT
2a40: 61 62 6c 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69  able->db;.  sqli
2a50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
2a60: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
2a70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2a80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
2a90: 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  ve the given ind
2aa0: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
2ab0: 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e  x hash table, an
2ac0: 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65  d free.** its me
2ad0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e  mory structures.
2ae0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
2af0: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
2b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
2b10: 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a  sh tables but.**
2b20: 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e   it is not unlin
2b30: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ked from the Tab
2b40: 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78  le that it index
2b50: 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67  es..** Unlinking
2b60: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
2b70: 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20  must be done by 
2b80: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
2b90: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2ba0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
2bb0: 74 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  teIndex(Index *p
2bc0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  ){.  Index *pOld
2bd0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2be0: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65  zName = p->zName
2bf0: 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  ;..  pOld = sqli
2c00: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
2c10: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
2c20: 73 68 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  sh, zName,.     
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
2c50: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2b 31 2c 20  len30(zName)+1, 
2c60: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  0);.  assert( pO
2c70: 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70  ld==0 || pOld==p
2c80: 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28   );.  freeIndex(
2c90: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
2ca0: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
2cb0: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
2cc0: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
2cd0: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
2ce0: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
2cf0: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
2d00: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
2d10: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
2d20: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
2d30: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
2d40: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
2d50: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
2d60: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
2d70: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
2d80: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
2d90: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
2da0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
2db0: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
2dc0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
2dd0: 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  dex;.  int len;.
2de0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20    Hash *pHash = 
2df0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
2e00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
2e10: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
2e20: 53 74 72 6c 65 6e 28 64 62 2c 20 7a 49 64 78 4e  Strlen(db, zIdxN
2e30: 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  ame);.  pIndex =
2e40: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2e50: 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61  rt(pHash, zIdxNa
2e60: 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20  me, len+1, 0);. 
2e70: 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
2e80: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70     if( pIndex->p
2e90: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70  Table->pIndex==p
2ea0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
2eb0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
2ec0: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
2ed0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
2ee0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
2ef0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49  ;.      for(p=pI
2f00: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2f10: 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e  ndex; p && p->pN
2f20: 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70  ext!=pIndex; p=p
2f30: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20  ->pNext){}.     
2f40: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65   if( p && p->pNe
2f50: 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  xt==pIndex ){.  
2f60: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
2f70: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f90: 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64    freeIndex(pInd
2fa0: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  ex);.  }.  db->f
2fb0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
2fc0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
2fd0: 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
2fe0: 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
2ff0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ion from the in-
3000: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
3010: 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c  es of.** a singl
3020: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
3030: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3040: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
3050: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
3060: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f  the database clo
3070: 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f  ses.  It is also
3080: 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61   called during a
3090: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20   rollback.** if 
30a0: 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d  there were schem
30b0: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
30c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
30d0: 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65   or if a.** sche
30e0: 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74  ma-cookie mismat
30f0: 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ch occurs..**.**
3100: 20 49 66 20 69 44 62 3d 3d 30 20 74 68 65 6e 20   If iDb==0 then 
3110: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
3120: 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  al schema tables
3130: 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
3140: 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20  e.** files.  If 
3150: 69 44 62 3e 3d 31 20 74 68 65 6e 20 72 65 73 65  iDb>=1 then rese
3160: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
3170: 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74  chema for only t
3180: 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c  he.** single fil
3190: 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  e indicated..*/.
31a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
31b0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
31c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
31d0: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20   iDb){.  int i, 
31e0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  j;.  assert( iDb
31f0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
3200: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  Db );..  if( iDb
3210: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
3220: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3230: 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  db);.  }.  for(i
3240: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
3250: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
3260: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3270: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3280: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3290: 61 73 73 65 72 74 28 69 3d 3d 31 20 7c 7c 20 28  assert(i==1 || (
32a0: 70 44 62 2d 3e 70 42 74 20 26 26 20 73 71 6c 69  pDb->pBt && sqli
32b0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
32c0: 65 78 28 70 44 62 2d 3e 70 42 74 29 29 29 3b 0a  ex(pDb->pBt)));.
32d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
32e0: 65 6d 61 46 72 65 65 28 70 44 62 2d 3e 70 53 63  emaFree(pDb->pSc
32f0: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
3300: 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74   if( iDb>0 ) ret
3310: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3320: 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64  t( iDb==0 );.  d
3330: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3340: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3350: 73 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  s;.  sqlite3Btre
3360: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
3370: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
3380: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
3390: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
33a0: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
33b0: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
33c0: 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
33d0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
33e0: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
33f0: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
3400: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
3410: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
3420: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
3430: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
3440: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
3450: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
3460: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
3470: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
3480: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
3490: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
34a0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
34b0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
34c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
34d0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
34e0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
34f0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3500: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75      if( pDb->pAu
3510: 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41  x && pDb->xFreeA
3520: 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41  ux ) pDb->xFreeA
3530: 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20  ux(pDb->pAux);. 
3540: 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d       pDb->pAux =
3550: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
3560: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
3570: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3580: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3590: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
35a0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
35b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
35c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 62  e3DbFree(db, pDb
35d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
35e0: 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  pDb->zName = 0;.
35f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
3600: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
3610: 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  i ){.      db->a
3620: 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[j] = db->aDb[
3630: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  i];.    }.    j+
3640: 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  +;.  }.  memset(
3650: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20  &db->aDb[j], 0, 
3660: 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65  (db->nDb-j)*size
3670: 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b  of(db->aDb[j]));
3680: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a  .  db->nDb = j;.
3690: 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32    if( db->nDb<=2
36a0: 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d   && db->aDb!=db-
36b0: 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20  >aDbStatic ){.  
36c0: 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62    memcpy(db->aDb
36d0: 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c  Static, db->aDb,
36e0: 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44   2*sizeof(db->aD
36f0: 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69  b[0]));.    sqli
3700: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
3710: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
3720: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
3730: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
3740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3750: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3760: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
3770: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
3780: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
3790: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
37a0: 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  {.  db->flags &=
37b0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
37c0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
37d0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
37e0: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74  n names from a t
37f0: 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f  able or view..*/
3800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3810: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
3820: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
3830: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
3840: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
3850: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 61  qlite3 *db = pTa
3860: 62 6c 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  ble->db;.  asser
3870: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
3880: 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54    if( (pCol = pT
3890: 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29  able->aCol)!=0 )
38a0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
38b0: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
38c0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
38d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
38e0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  (db, pCol->zName
38f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3900: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3910: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
3920: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3930: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
3940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3950: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
3960: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
3970: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3980: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
3990: 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  l);.  }.  pTable
39a0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
39b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
39c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
39d0: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
39e0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
39f0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
3a00: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
3a10: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
3a20: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
3a30: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
3a40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3a50: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
3a60: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
3a70: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
3a80: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
3a90: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3aa0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3ab0: 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20  able.  Nor does 
3ac0: 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72  it remove.** for
3ad0: 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74  eign keys from t
3ae0: 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20  he sqlite.aFKey 
3af0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
3b00: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
3b10: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
3b20: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
3b30: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
3b40: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3b50: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
3b60: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
3b70: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
3b80: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3b90: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
3ba0: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
3bb0: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
3bc0: 65 79 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ey;.  sqlite3 *d
3bd0: 62 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65  b;..  if( pTable
3be0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3bf0: 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 3b  db = pTable->db;
3c00: 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65  ..  /* Do not de
3c10: 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75  lete the table u
3c20: 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e  ntil the referen
3c30: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
3c40: 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62   zero. */.  pTab
3c50: 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  le->nRef--;.  if
3c60: 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30  ( pTable->nRef>0
3c70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
3c80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
3c90: 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  able->nRef==0 );
3ca0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
3cb0: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
3cc0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
3cd0: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
3ce0: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
3cf0: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
3d00: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
3d10: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
3d20: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
3d30: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70  ssert( pIndex->p
3d40: 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e  Schema==pTable->
3d50: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
3d60: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
3d70: 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  x(pIndex);.  }..
3d80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3d90: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
3da0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
3db0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
3dc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3dd0: 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65  s table.  The ke
3de0: 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  ys.  ** should h
3df0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
3e00: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
3e10: 68 65 20 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  he pSchema->aFKe
3e20: 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20  y hash table .  
3e30: 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  */.  for(pFKey=p
3e40: 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46  Table->pFKey; pF
3e50: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74  Key; pFKey=pNext
3e60: 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74  FKey){.    pNext
3e70: 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e  FKey = pFKey->pN
3e80: 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73  extFrom;.    ass
3e90: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
3ea0: 46 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70 53  Find(&pTable->pS
3eb0: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20  chema->aFKey,.  
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
3ee0: 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  zTo, sqlite3Strl
3ef0: 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  en30(pFKey->zTo)
3f00: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
3f10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3f20: 64 62 2c 20 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  db, pFKey);.  }.
3f30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c  #endif..  /* Del
3f40: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
3f50: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
3f60: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73    */.  sqliteRes
3f70: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
3f80: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
3f90: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
3fa0: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
3fb0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3fc0: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
3fd0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
3fe0: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
3ff0: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23 69 66  e->pSelect);.#if
4000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4010: 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74 65 33  _CHECK.  sqlite3
4020: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4030: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
4040: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
4050: 56 74 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65  VtabClear(pTable
4060: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4070: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ee(db, pTable);.
4080: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
4090: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
40a0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
40b0: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
40c0: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
40d0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
40e0: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
40f0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
4100: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4110: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4120: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
4130: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
4140: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
4150: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4160: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
4170: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
4180: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
4190: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
41a0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
41b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
41c0: 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61  abName && zTabNa
41d0: 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d  me[0] );.  pDb =
41e0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
41f0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
4200: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
4210: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
4220: 7a 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20  zTabName,.      
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33    sqlite3Strlen3
4250: 30 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  0(zTabName)+1,0)
4260: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
4270: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4280: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4290: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
42a0: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
42b0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
42c0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 71 6c     int nTo = sql
42d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46 31  ite3Strlen30(pF1
42e0: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
42f0: 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48    pF2 = sqlite3H
4300: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 70 53  ashFind(&pDb->pS
4310: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
4320: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  1->zTo, nTo);.  
4330: 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31      if( pF2==pF1
4340: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4350: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
4360: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  Db->pSchema->aFK
4370: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
4380: 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29  o, pF1->pNextTo)
4390: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
43a0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
43b0: 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54  2 && pF2->pNextT
43c0: 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46  o!=pF1 ){ pF2=pF
43d0: 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20  2->pNextTo; }.  
43e0: 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b        if( pF2 ){
43f0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e  .          pF2->
4400: 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70  pNextTo = pF1->p
4410: 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20  NextTo;.        
4420: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4430: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
4440: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29  e3DeleteTable(p)
4450: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
4460: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
4470: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
4480: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
4490: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
44a0: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
44b0: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
44c0: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69  that.** token wi
44d0: 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e  th any quotation
44e0: 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63  s removed.  Spac
44f0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
4500: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4510: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
4520: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
4530: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
4540: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
4550: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
4560: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
4570: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
4580: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
4590: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
45a0: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
45b0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
45c0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
45d0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
45e0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
45f0: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4600: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4610: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4620: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4630: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
4640: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4650: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
4660: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
4670: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
4680: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
4690: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
46a0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
46b0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
46c0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
46d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
46e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
46f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
4700: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4710: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
4720: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
4730: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
4740: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
4750: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
4760: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
4770: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
4780: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
4790: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
47a0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
47b0: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
47c0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
47d0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
47e0: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
47f0: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
4800: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4810: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
4820: 6d 6e 73 2c 20 30 2c 20 35 29 3b 2f 2a 20 73 71  mns, 0, 5);/* sq
4830: 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20  lite_master has 
4840: 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 73  5 columns */.  s
4850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4860: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
4870: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
4880: 2c 20 69 44 62 29 3b 0a 20 20 69 66 28 20 70 2d  , iDb);.  if( p-
4890: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
48a0: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
48b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
48c0: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
48d0: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
48e0: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
48f0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
4900: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
4910: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
4920: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
4930: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
4940: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
4950: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
4960: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4970: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4980: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
4990: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
49a0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
49b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
49c0: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
49d0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
49e0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
49f0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
4a00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
4a10: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
4a20: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
4a30: 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  Db;.    int n = 
4a40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4a50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
4a60: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
4a70: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
4a80: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
4a90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f  ){.      if( (!O
4aa0: 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21  MIT_TEMPDB || i!
4ab0: 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74  =1 ) && n==sqlit
4ac0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e  e3Strlen30(pDb->
4ad0: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
4ae0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
4af0: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
4b00: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
4b10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4b30: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
4b40: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
4b50: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
4b60: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
4b70: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
4b80: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
4b90: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
4ba0: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
4bb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
4bc0: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
4bd0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
4be0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
4bf0: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
4c00: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
4c10: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
4c20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
4c30: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
4c40: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4c50: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4c80: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
4c90: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20       /* Name we 
4cc0: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
4cd0: 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  r */.  zName = s
4ce0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4cf0: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
4d00: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    i = sqlite3Fin
4d10: 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d  dDbName(db, zNam
4d20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4d30: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
4d40: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4d50: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
4d60: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
4d70: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
4d80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
4d90: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
4da0: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
4db0: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
4dc0: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
4dd0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
4de0: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
4df0: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
4e00: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
4e10: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4e20: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
4e30: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
4e40: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
4e50: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
4e60: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
4e70: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
4e80: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
4e90: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
4ea0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4eb0: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
4ec0: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
4ed0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4ee0: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
4ef0: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
4f00: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
4f10: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
4f20: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
4f30: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
4f40: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
4f50: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
4f60: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
4f70: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
4f80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4f90: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
4fa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4fb0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
4fc0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
4fd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4fe0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4ff0: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
5000: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
5010: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
5020: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5030: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
5040: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
5050: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
5060: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
5070: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
5080: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
5090: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
50a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
50d0: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
50e0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
50f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5100: 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26  ..  if( pName2 &
5110: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
5120: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
5130: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
5140: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5150: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
5160: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
5170: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5180: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5190: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
51a0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
51b0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
51c0: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
51d0: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
51e0: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
51f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5200: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
5210: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
5220: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
5230: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5240: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5250: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5260: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
5270: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
5280: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
5290: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
52a0: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
52b0: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
52c0: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
52d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
52e0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
52f0: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
5300: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
5310: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
5320: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
5330: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
5340: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
5350: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
5360: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
5370: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
5380: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
5390: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
53a0: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
53b0: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
53c0: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
53d0: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
53e0: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
53f0: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
5400: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
5410: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5420: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
5430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
5440: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5450: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
5460: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
5470: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
5480: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
5490: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
54a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
54b0: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
54c0: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
54d0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
54e0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
54f0: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
5500: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5510: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
5520: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5530: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
5540: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
5550: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
5560: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5570: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5580: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
5590: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
55a0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
55b0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
55c0: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
55d0: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
55e0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
55f0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
5600: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
5610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5620: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
5630: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
5640: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
5650: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
5660: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
5670: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
5680: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
5690: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
56a0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
56b0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
56c0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
56d0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
56e0: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
56f0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
5700: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
5710: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
5720: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
5730: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
5740: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
5750: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
5760: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
5770: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
5780: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
5790: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
57a0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
57b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
57c0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
57d0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
57e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
57f0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
5800: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
5810: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
5820: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
5830: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
5840: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
5850: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
5860: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
5870: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
5880: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
5890: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
58a0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
58b0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
58c0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
58d0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
58e0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
58f0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
5900: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
5910: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
5920: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
5930: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
5940: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
5950: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5960: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5970: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
5980: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
5990: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
59a0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
59b0: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
59c0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
59d0: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
59e0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
59f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
5a00: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
5a10: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
5a20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
5a30: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
5a40: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
5a50: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
5a60: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
5a70: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
5a80: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
5a90: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
5aa0: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
5ab0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
5ac0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
5ad0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5ae0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
5af0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
5b00: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5b10: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
5b20: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
5b30: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5b40: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
5b50: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
5b60: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
5b70: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
5b80: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
5b90: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
5ba0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5bb0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
5bc0: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
5bd0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5be0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5bf0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5c00: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
5c10: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5c20: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5c30: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
5c40: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5c50: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5c60: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5c70: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
5c80: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
5c90: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5ca0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5cb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
5cc0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5cd0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
5ce0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5cf0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
5d00: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
5d10: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
5d20: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
5d30: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
5d40: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
5d50: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
5d60: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
5d70: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
5d80: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
5d90: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
5da0: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
5db0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5dc0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
5dd0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5de0: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
5df0: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
5e00: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
5e10: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
5e20: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
5e30: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
5e40: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
5e50: 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  ;.  if( !OMIT_TE
5e60: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
5e70: 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f  & iDb>1 ){.    /
5e80: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
5e90: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
5ea0: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
5eb0: 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20  qualified */.   
5ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5ed0: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
5ee0: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
5ef0: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
5f00: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
5f10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49  ;.  }.  if( !OMI
5f20: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5f30: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
5f40: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
5f50: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
5f60: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5f70: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5f80: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
5f90: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
5fa0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
5fb0: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
5fc0: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
5fd0: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
5fe0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5ff0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
6000: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6010: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
6020: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6030: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
6040: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
6050: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
6060: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
6070: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
6080: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6090: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
60a0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
60b0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
60c0: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
60d0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
60e0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
60f0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6100: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6110: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
6120: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
6130: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6140: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
6150: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6160: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
6170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6180: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6190: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
61a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
61b0: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
61c0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
61d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
61e0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
61f0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
6200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6210: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6220: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
6230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6240: 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26  if( !isVirtual &
6250: 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  & sqlite3AuthChe
6260: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
6270: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
6280: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6290: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
62a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
62b0: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
62c0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
62d0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
62e0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
62f0: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
6300: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
6310: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
6320: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
6330: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
6340: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54  .  ** it does. T
6350: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
6360: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
6370: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61   being parsed wa
6380: 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f  s passed.  ** to
6390: 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c   an sqlite3_decl
63a0: 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e  are_vtab() call.
63b0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   In that case on
63c0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
63d0: 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70  mes.  ** and typ
63e0: 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  es will be used,
63f0: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
6400: 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  need to test for
6410: 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20   namespace.  ** 
6420: 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f  collisions..  */
6430: 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41  .  if( !IN_DECLA
6440: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69  RE_VTAB ){.    i
6450: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
6460: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
6470: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
6480: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6490: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
64a0: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
64b0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
64c0: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
64d0: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  iDb].zName);.   
64e0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
64f0: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
6500: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6510: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6520: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
6530: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
6540: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
6550: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6560: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6570: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
6580: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
6590: 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28  Name, 0)!=0 && (
65a0: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
65b0: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
65c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
65d0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
65e0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
65f0: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
6600: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
6610: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6620: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
6630: 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ..  pTable = sql
6640: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
6650: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
6660: 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  e));.  if( pTabl
6670: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  e==0 ){.    db->
6680: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
6690: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
66a0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
66b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
66c0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
66d0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
66e0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
66f0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
6700: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
6710: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
6720: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
6730: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
6740: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31  pTable->nRef = 1
6750: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 64 62 20 3d  ;.  pTable->db =
6760: 20 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73   db;.  if( pPars
6770: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
6780: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
6790: 65 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e(pParse->pNewTa
67a0: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
67b0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
67c0: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
67d0: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
67e0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
67f0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
6800: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
6810: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
6820: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
6830: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
6840: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
6850: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
6860: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
6870: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
6880: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
6890: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
68a0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
68b0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
68c0: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
68d0: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
68e0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  e")==0 ){.    pT
68f0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
6900: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
6910: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
6920: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
6930: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
6940: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
6950: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
6960: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
6970: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
6980: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
6990: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
69a0: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
69b0: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
69c0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
69d0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
69e0: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
69f0: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
6a00: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
6a10: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
6a20: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
6a30: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
6a40: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
6a50: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
6a60: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
6a70: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
6a80: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
6a90: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
6aa0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6ab0: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
6ac0: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
6ad0: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
6ae0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
6af0: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
6b00: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
6b10: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
6b20: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
6b30: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
6b40: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
6b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
6b60: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
6b70: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
6b80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6b90: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6ba0: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
6bb0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
6bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
6bd0: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
6be0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
6bf0: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
6c00: 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64  format and encod
6c10: 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62  ing in the datab
6c20: 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  ase have not bee
6c30: 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73  n set, .    ** s
6c40: 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20  et them now..   
6c50: 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70   */.    reg1 = p
6c60: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20  Parse->regRowid 
6c70: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6c80: 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61  ;.    reg2 = pPa
6c90: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b  rse->regRoot = +
6ca0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6cb0: 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72     reg3 = ++pPar
6cc0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
6cd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6ce0: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
6cf0: 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 31 29 3b  , iDb, reg3, 1);
6d00: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
6d10: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
6d20: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
6d30: 20 69 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20   iDb);.    j1 = 
6d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d50: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
6d60: 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61  );.    fileForma
6d70: 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  t = (db->flags &
6d80: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
6d90: 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20  leFmt)!=0 ?.    
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
6db0: 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c  : SQLITE_MAX_FIL
6dc0: 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71  E_FORMAT;.    sq
6dd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6de0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66  v, OP_Integer, f
6df0: 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29  ileFormat, reg3)
6e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6e10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
6e20: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c  tCookie, iDb, 1,
6e30: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
6e40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6e50: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43   OP_Integer, ENC
6e60: 28 64 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20  (db), reg3);.   
6e70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6e80: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
6e90: 69 65 2c 20 69 44 62 2c 20 34 2c 20 72 65 67 33  ie, iDb, 4, reg3
6ea0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6eb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
6ec0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
6ed0: 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70  just creates a p
6ee0: 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f  lace-holder reco
6ef0: 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  rd in the sqlite
6f00: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20  _master table.. 
6f10: 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64     ** The record
6f20: 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f   created does no
6f30: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69  t contain anythi
6f40: 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c  ng yet.  It will
6f50: 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20   be replaced.   
6f60: 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20   ** by the real 
6f70: 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65  entry in code ge
6f80: 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74  nerated at sqlit
6f90: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20  e3EndTable()..  
6fa0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
6fb0: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65  rowid for the ne
6fc0: 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20  w entry is left 
6fd0: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
6fe0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  e stack..    ** 
6ff0: 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20  The rowid value 
7000: 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  is needed by the
7010: 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
7020: 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a  e3EndTable will.
7030: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e      ** generate.
7040: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
7050: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7060: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
7070: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
7080: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
7090: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
70a0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
70b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
70c0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
70d0: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
70e0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
70f0: 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65    {.      sqlite
7100: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7110: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
7120: 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d  Db, reg2);.    }
7130: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
7140: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
7150: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
7160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7170: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7180: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
7190: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
71a0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
71b0: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
71c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
71d0: 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67  P_Insert, 0, reg
71e0: 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  3, reg1);.    sq
71f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7200: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7210: 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ND);.    sqlite3
7220: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7230: 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  _Close);.  }..  
7240: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
7250: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
7260: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
7270: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7280: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
7290: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
72a0: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
72b0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
72c0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
72d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
72e0: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  o is used to com
72f0: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
7300: 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e   in a case-insen
7310: 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a  sitive manner..*
7320: 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79  * It is slightly
7330: 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c   faster than cal
7340: 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49  ling sqlite3StrI
7350: 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20  Cmp() directly, 
7360: 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20  but.** produces 
7370: 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a  larger code..**.
7380: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73  ** WARNING: This
7390: 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f   macro is not co
73a0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
73b0: 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c  e strcmp() famil
73c0: 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  y. It.** returns
73d0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f   true if the two
73e0: 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75   strings are equ
73f0: 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61  al, otherwise fa
7400: 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lse..*/.#define 
7410: 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c  STRICMP(x, y) (\
7420: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
7430: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
7440: 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20  char *)(x)]==   
7450: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7460: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7470: 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20   char *)(y)]    
7480: 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72   \.&& sqlite3Str
7490: 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31  ICmp((x)+1,(y)+1
74a0: 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  )==0 )../*.** Ad
74b0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
74c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
74d0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
74e0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
74f0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
7500: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
7510: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
7520: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
7530: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
7540: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
7550: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
7560: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
7570: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
7580: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
7590: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
75a0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
75b0: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
75c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
75d0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
75e0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
75f0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
7600: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
7610: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
7620: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
7630: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7640: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7650: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7660: 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20  0 ) return;.#if 
7670: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
7680: 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b  N.  if( p->nCol+
7690: 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  1>db->aLimit[SQL
76a0: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
76b0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
76c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
76d0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
76e0: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
76f0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
7700: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  ;.  }.#endif.  z
7710: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7720: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
7730: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
7740: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
7750: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
7760: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52  ++){.    if( STR
7770: 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  ICMP(z, p->aCol[
7780: 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  i].zName) ){.   
7790: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
77a0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
77b0: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
77c0: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
77d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
77e0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
77f0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
7800: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
7810: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
7820: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
7830: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
7840: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
7850: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
7860: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
7870: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
7880: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
7890: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
78a0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
78b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
78c0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
78d0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
78e0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
78f0: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
7900: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
7910: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
7920: 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66  e = z;. .  /* If
7930: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
7940: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
7950: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
7960: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
7970: 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74   ** 'NONE'. If t
7980: 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73  here is a type s
7990: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
79a0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
79b0: 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20  ype() will.  ** 
79c0: 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74  be called next t
79d0: 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69  o set pCol->affi
79e0: 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a  nity correctly..
79f0: 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66    */.  pCol->aff
7a00: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
7a10: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43  FF_NONE;.  p->nC
7a20: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
7a30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7a40: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
7a50: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
7a60: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
7a70: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
7a80: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7a90: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
7aa0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
7ab0: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
7ac0: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
7ad0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
7ae0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
7af0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
7b00: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
7b10: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
7b20: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
7b30: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
7b40: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
7b50: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
7b60: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
7b70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7b80: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7b90: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
7ba0: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
7bb0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
7bc0: 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  l = (u8)onError;
7bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
7be0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
7bf0: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
7c00: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
7c10: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
7c20: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
7c30: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
7c40: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
7c50: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
7c60: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
7c70: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
7c80: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
7c90: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
7ca0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
7cb0: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
7cc0: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
7cd0: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
7ce0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
7cf0: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
7d00: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
7d10: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7d20: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
7d30: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
7d40: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
7d50: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
7d60: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
7d70: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
7d80: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
7d90: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
7da0: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
7db0: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
7dc0: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
7df0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7e00: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
7e10: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
7e20: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7e30: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
7e40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7e50: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
7e60: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
7e70: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
7e80: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7e90: 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27  F_NONE.** 'REAL'
7ea0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7eb0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
7ec0: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
7ed0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
7ee0: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
7ef0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
7f00: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
7f10: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
7f20: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
7f30: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
7f40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
7f50: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
7f60: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
7f70: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
7f80: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  st Token *pType)
7f90: 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20  {.  u32 h = 0;. 
7fa0: 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49   char aff = SQLI
7fb0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
7fc0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7fd0: 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79   char *zIn = pTy
7fe0: 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75  pe->z;.  const u
7ff0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45  nsigned char *zE
8000: 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70  nd = &pType->z[p
8010: 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69  Type->n];..  whi
8020: 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b  le( zIn!=zEnd ){
8030: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20  .    h = (h<<8) 
8040: 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  + sqlite3UpperTo
8050: 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20  Lower[*zIn];.   
8060: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
8070: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8080: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
8090: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
80a0: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
80b0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
80c0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20  TE_AFF_TEXT; .  
80d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
80e0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
80f0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
8100: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
8110: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
8120: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8130: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
8140: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
8150: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
8160: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
8170: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
8180: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8190: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
81a0: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
81b0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
81c0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
81d0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
81e0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
81f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8200: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
8210: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
8220: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8230: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66  TE_AFF_NONE;.#if
8240: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8250: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
8260: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8270: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
8280: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8290: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
82a0: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
82b0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
82c0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
82d0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
82e0: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
82f0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
8300: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
8310: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
8320: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
8330: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
8340: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
8350: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
8360: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8370: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
8380: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
8390: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
83a0: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
83b0: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
83c0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
83d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
83e0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
83f0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8400: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
8410: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
8420: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
8430: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
8440: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
8450: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8460: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
8470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8490: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
84a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
84b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
84c0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
84d0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
84e0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
84f0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8500: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
8510: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
8520: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
8530: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
8540: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
8550: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
8560: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
8570: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8580: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
8590: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
85a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
85b0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
85c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
85d0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
85e0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
85f0: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
8600: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
8610: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
8620: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
8630: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
8640: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
8650: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8660: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
8670: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
8680: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8690: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
86a0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
86b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
86c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
86d0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
86e0: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
86f0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
8700: 6f 6c 5b 69 5d 3b 0a 20 20 64 62 20 3d 20 70 50  ol[i];.  db = pP
8710: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69  arse->db;.  sqli
8720: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
8730: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
8740: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
8750: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
8760: 28 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70  (db, pType);.  p
8770: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
8780: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
8790: 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f  ype(pType);.}../
87a0: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
87b0: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
87c0: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
87d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
87e0: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
87f0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
8800: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8810: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
8820: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
8830: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
8840: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
8850: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
8860: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
8870: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
8880: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8890: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
88a0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
88b0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
88c0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
88d0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
88e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
88f0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
8900: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8910: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
8920: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
8930: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
8940: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8950: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20  e->db;.  if( (p 
8960: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8970: 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ble)!=0 ){.    p
8980: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
8990: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
89a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
89b0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
89c0: 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a  ction(pExpr) ){.
89d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
89e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
89f0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
8a00: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
8a10: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
8a20: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
8a30: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
8a40: 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  .      /* A copy
8a50: 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65   of pExpr is use
8a60: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
8a70: 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45   original, as pE
8a80: 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  xpr contains.   
8a90: 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61     ** tokens tha
8aa0: 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74  t point to volat
8ab0: 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20  ile memory. The 
8ac0: 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78  'span' of the ex
8ad0: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
8ae0: 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  * is required by
8af0: 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e   pragma table_in
8b00: 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fo..      */.   
8b10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
8b20: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
8b30: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
8b40: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
8b50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
8b60: 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44  xpr, EXPRDUP_RED
8b70: 55 43 45 7c 45 58 50 52 44 55 50 5f 53 50 41 4e  UCE|EXPRDUP_SPAN
8b80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
8b90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8ba0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
8bb0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
8bc0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8bd0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
8be0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
8bf0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
8c00: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
8c10: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
8c20: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
8c30: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
8c40: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
8c50: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
8c60: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
8c70: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
8c80: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
8c90: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
8ca0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
8cb0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
8cc0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
8cd0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
8ce0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
8cf0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
8d00: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
8d10: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
8d20: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8d30: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
8d40: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
8d50: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
8d60: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
8d70: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
8d80: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
8d90: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
8da0: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
8db0: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
8dc0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8dd0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
8de0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
8df0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8e00: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
8e10: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
8e20: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
8e30: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
8e40: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
8e50: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
8e60: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
8e70: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
8e80: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
8e90: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
8ea0: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
8eb0: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
8ec0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8ed0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
8ee0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
8ef0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
8f00: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8f10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8f20: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8f30: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
8f40: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
8f50: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
8f60: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
8f70: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
8f80: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
8f90: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
8fa0: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
8fb0: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
8fc0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
8fd0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
8fe0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
8ff0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
9000: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
9010: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
9020: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
9030: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9040: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
9050: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
9060: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
9070: 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  b==0 || IN_DECLA
9080: 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70  RE_VTAB ) goto p
9090: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
90a0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
90b0: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
90c0: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
90d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
90e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
90f0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
9100: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
9110: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
9120: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
9130: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
9140: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
9150: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
9160: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
9170: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
9180: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
9190: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
91a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
91b0: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
91c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
91d0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
91e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
91f0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
9200: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
9210: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
9220: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9230: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
9240: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
9250: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
9260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
9270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9290: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
92a0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  l ){.        pTa
92b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
92c0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
92d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
92e0: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  f( pList->nExpr>
92f0: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
9300: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
9310: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
9320: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
9330: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
9340: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
9350: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
9360: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
9370: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
9380: 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72  0.        && sor
9390: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
93a0: 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61  O_ASC ){.    pTa
93b0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
93c0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
93d0: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
93e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
93f0: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
9400: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
9410: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9420: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
9430: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73  ncrement;.  }els
9440: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
9450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9460: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
9470: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
9480: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9490: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
94a0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
94b0: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
94c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
94d0: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
94e0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
94f0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
9500: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
9510: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  st, onError, 0, 
9520: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29  0, sortOrder, 0)
9530: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
9540: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
9550: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
9560: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9570: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
9580: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
9590: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
95a0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
95b0: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
95c0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
95d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
95e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
95f0: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
9600: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9610: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9620: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9630: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
9640: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
9650: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71  ssion */.){.  sq
9660: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9670: 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
9680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
9690: 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  K.  Table *pTab 
96a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
96b0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20  ble;.  if( pTab 
96c0: 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  && !IN_DECLARE_V
96d0: 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  TAB ){.    /* Th
96e0: 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73 69  e CHECK expressi
96f0: 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c 69  on must be dupli
9700: 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 6f  cated so that to
9710: 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20 2a  kens refer.    *
9720: 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70  * to malloced sp
9730: 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ace and not the 
9740: 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78 74  (ephemeral) text
9750: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
9760: 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61 74  ABLE.    ** stat
9770: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61  ement */.    pTa
9780: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
9790: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
97a0: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20  Tab->pCheck, .  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
97e0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 2c 20 30  b, pCheckExpr, 0
97f0: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
9800: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9810: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70  te(db, pCheckExp
9820: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
9830: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9840: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
9850: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
9860: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
9870: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
9880: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
9890: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
98a0: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
98b0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
98c0: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
98d0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
98e0: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
9900: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
9910: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
9920: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
9930: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
9940: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
9950: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
9960: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
9970: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9980: 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  zColl = sqlit
9990: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
99a0: 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
99b0: 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
99c0: 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  rn;..  if( sqlit
99d0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
99e0: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
99f0: 31 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  1) ){.    Index 
9a00: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
9a10: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
9a20: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
9a30: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
9a40: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
9a50: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
9a60: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
9a70: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
9a80: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
9a90: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
9aa0: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
9ab0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
9ac0: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
9ad0: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
9ae0: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
9af0: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
9b00: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
9b10: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9b20: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9b30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
9b40: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
9b50: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9b60: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
9b70: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
9b80: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
9b90: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
9ba0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9bb0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9bc0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
9bd0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9bf0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9c00: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9c10: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9c20: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9c30: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
9c40: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9c50: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
9c60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
9c70: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9c80: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9c90: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9ca0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9cb0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9cc0: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9cd0: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9ce0: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
9cf0: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
9d00: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
9d10: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
9d20: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
9d30: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
9d40: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
9d50: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
9d60: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
9d70: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9d80: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9d90: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9da0: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9db0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9dc0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9dd0: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9de0: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9df0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9e00: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9e10: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
9e20: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
9e30: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
9e40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9e50: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
9e60: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
9e70: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
9e80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
9e90: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
9ea0: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
9eb0: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
9ec0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
9ed0: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
9ee0: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
9ef0: 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  age..*/.CollSeq 
9f00: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
9f10: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
9f20: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
9f30: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
9f40: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
9f50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9f60: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
9f70: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
9f80: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
9f90: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
9fa0: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
9fb0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9fc0: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
9fd0: 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75  e, nName, initbu
9fe0: 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  sy);.  if( !init
9ff0: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
a000: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
a010: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
a020: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
a030: 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61  q(db, pColl, zNa
a040: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
a050: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
a060: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20      if( nName<0 
a070: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65  ){.        nName
a080: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a090: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
a0a0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a0b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a0c0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
a0d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
a0e0: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
a0f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
a100: 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
a110: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
a120: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
a130: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
a140: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
a150: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
a160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
a170: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
a180: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
a190: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
a1a0: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
a1b0: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
a1c0: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
a1d0: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
a1e0: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
a1f0: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
a200: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
a210: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
a220: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
a230: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
a240: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
a250: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
a260: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
a270: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
a280: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
a290: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
a2a0: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
a2b0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
a2c0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
a2d0: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
a2e0: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
a2f0: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
a300: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
a310: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
a320: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
a330: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
a340: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
a350: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
a360: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
a370: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
a380: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
a390: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
a3a0: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
a3b0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
a3c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
a3d0: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
a3e0: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
a3f0: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
a400: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
a410: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
a420: 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72  nt iDb){.  int r
a430: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
a440: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a450: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a460: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
a470: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a480: 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 56  Vdbe;.  sqlite3V
a490: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a4a0: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
a4b0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
a4c0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
a4d0: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
a4e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
a4f0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30  etCookie, iDb, 0
a500: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
a510: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a520: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
a530: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
a540: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
a550: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
a560: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
a570: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
a580: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
a590: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
a5a0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
a5b0: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
a5c0: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
a5d0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
a5e0: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
a5f0: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
a600: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
a610: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
a620: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
a630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a640: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
a650: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
a660: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
a670: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
a680: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
a690: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
a6a0: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
a6b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69  /*.** Write an i
a6c0: 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74  dentifier onto t
a6d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69  he end of the gi
a6e0: 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64  ven string.  Add
a6f0: 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63  .** quote charac
a700: 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a  ters as needed..
a710: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
a720: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
a730: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
a740: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
a750: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a760: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
a770: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
a780: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
a790: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
a7a0: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
a7b0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a7c0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
a7d0: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
a7e0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a7f0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a800: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a810: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
a820: 5b 6a 5d 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  [j]!=0 || sqlite
a830: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
a840: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
a850: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
a860: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
a870: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
a880: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a890: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a8a0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
a8b0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
a8c0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
a8d0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
a8e0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
a8f0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
a900: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
a910: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a920: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
a930: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
a940: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
a950: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a960: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
a970: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
a980: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
a990: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
a9a0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
a9b0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
a9c0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
a9d0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
a9e0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
a9f0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
aa00: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
aa10: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
aa20: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
aa30: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
aa40: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
aa50: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
aa60: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
aa70: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
aa80: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
aa90: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
aaa0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
aab0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
aac0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
aad0: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
aae0: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
aaf0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
ab00: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
ab10: 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
ab20: 33 30 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  30(z) + 1);.    
ab30: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
ab40: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
ab50: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
ab60: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
ab70: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
ab80: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
ab90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
aba0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
abb0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
abc0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
abd0: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
abe0: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
abf0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
ac00: 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  3Malloc( n );.  
ac10: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
ac20: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
ac30: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
ac40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
ac50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
ac60: 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45  , zStmt, "CREATE
ac70: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
ac80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ac90: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
aca0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
acb0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
acc0: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
acd0: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
ace0: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
acf0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ad00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ad10: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
ad20: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
ad30: 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  k += sqlite3Strl
ad40: 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  en30(&zStmt[k]);
ad50: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
ad60: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
ad70: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
ad80: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
ad90: 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70   (z = pCol->zTyp
ada0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  e)!=0 ){.      z
adb0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b  Stmt[k++] = ' ';
adc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
add0: 69 6e 74 29 28 73 71 6c 69 74 65 33 53 74 72 6c  int)(sqlite3Strl
ade0: 65 6e 33 30 28 7a 29 2b 6b 2b 31 29 3c 3d 6e 20  en30(z)+k+1)<=n 
adf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ae00: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
ae10: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
ae20: 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  z);.      k += s
ae30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ae40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
ae50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ae60: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
ae70: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
ae80: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
ae90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
aea0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
aeb0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
aec0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
aed0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
aee0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
aef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
af00: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
af10: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
af20: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
af30: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
af40: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
af50: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
af60: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
af70: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
af80: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
af90: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
afa0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
afb0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
afc0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
afd0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
afe0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
aff0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
b000: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
b010: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
b020: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
b030: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
b040: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
b050: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
b060: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
b070: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
b080: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
b090: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
b0a0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
b0b0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
b0c0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
b0d0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
b0e0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
b0f0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
b100: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
b110: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
b120: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
b130: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
b140: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
b150: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
b160: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
b170: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
b180: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
b190: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
b1a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
b1b0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
b1c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
b1d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
b1e0: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
b1f0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
b200: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
b210: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
b220: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
b230: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
b240: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
b250: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
b260: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
b270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b280: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
b290: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
b2a0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
b2b0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
b2c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
b2d0: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
b2e0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
b2f0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
b300: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
b310: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
b320: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
b330: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
b340: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
b350: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b360: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
b370: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
b380: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
b390: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
b3a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b3b0: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b   ) {.    return;
b3c0: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
b3d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
b3e0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b3f0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
b400: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
b410: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
b420: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
b430: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
b440: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
b450: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b460: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
b470: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
b480: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b490: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
b4a0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
b4b0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
b4c0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
b4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
b4e0: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
b4f0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
b500: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
b510: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
b520: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
b530: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
b540: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
b550: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
b560: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
b570: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
b580: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
b590: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
b5a0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
b5b0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
b5c0: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
b5d0: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
b5e0: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
b5f0: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
b600: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
b610: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
b620: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
b630: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
b640: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
b650: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
b660: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
b670: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
b680: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
b690: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
b6a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b6b0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
b6c0: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
b6d0: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
b6e0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b6f0: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
b700: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
b710: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
b720: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
b730: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
b740: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
b750: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
b760: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
b770: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
b780: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
b790: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
b7a0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
b7b0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
b7c0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
b7d0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
b7e0: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
b7f0: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
b800: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
b810: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
b820: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
b830: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
b840: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
b850: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
b860: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
b870: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
b880: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
b890: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
b8a0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
b8b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
b8c0: 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
b8d0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
b8e0: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20  new table entry 
b8f0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
b900: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
b910: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
b920: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
b930: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
b940: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
b950: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
b960: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
b970: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
b980: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
b990: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
b9a0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
b9b0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
b9c0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
b9d0: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
b9e0: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
b9f0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
ba00: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
ba10: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
ba20: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
ba30: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
ba40: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
ba50: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
ba60: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
ba70: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
ba80: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
ba90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
baa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bab0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
bac0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  , 0);..    /* Cr
bad0: 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
bae0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  e for the new ta
baf0: 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20  ble and push it 
bb00: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
bb10: 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61      ** A view ha
bb20: 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73  s no rootpage, s
bb30: 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65  o just push a ze
bb40: 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ro onto the stac
bb50: 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65  k for.    ** vie
bb60: 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  ws.  Initialize 
bb70: 7a 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d  zType at the sam
bb80: 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  e time..    */. 
bb90: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
bba0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
bbb0: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
bbc0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
bbd0: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
bbe0: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
bbf0: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
bc00: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
bc10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
bc20: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
bc30: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
bc40: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
bc50: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
bc60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
bc70: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
bc80: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
bc90: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
bca0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
bcb0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
bcc0: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
bcd0: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
bce0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
bcf0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
bd00: 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74  able is on the t
bd10: 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73  op of the vdbe s
bd20: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tack..    **.   
bd30: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
bd40: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
bd50: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
bd60: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
bd70: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
bd80: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
bd90: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
bda0: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
bdb0: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
bdc0: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
bdd0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
bde0: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
bdf0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
be00: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
be10: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
be20: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
be30: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
be40: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
be50: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
be60: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
be70: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
be80: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
be90: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
bea0: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
beb0: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
bec0: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
bed0: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
bee0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
bef0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
bf00: 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c  dest;.      Tabl
bf10: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20  e *pSelTab;..   
bf20: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
bf30: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
bf40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf50: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
bf60: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
bf70: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
bf80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bf90: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
bfa0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
bfb0: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
bfc0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
bfd0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54  nit(&dest, SRT_T
bfe0: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
bff0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c000: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
c010: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
c020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c030: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
c040: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
c050: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
c060: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
c070: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
c080: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
c090: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
c0a0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
c0b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
c0c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
c0d0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
c0e0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
c0f0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
c100: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
c110: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
c120: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
c130: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
c140: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
c150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c160: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c  DeleteTable(pSel
c170: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
c180: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
c190: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
c1a0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
c1b0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
c1c0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
c1d0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
c1e0: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
c1f0: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
c200: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28  lse{.      n = (
c210: 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70  int)(pEnd->z - p
c220: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
c230: 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  n.z) + 1;.      
c240: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
c250: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
c260: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
c270: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
c280: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
c290: 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
c2a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c2b0: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
c2c0: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
c2d0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
c2e0: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
c2f0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c300: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
c310: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
c320: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
c330: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
c340: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
c350: 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69  ected.  The rowi
c360: 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c  d for the preall
c370: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c  ocated.    ** sl
c380: 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74  ot is the 2nd it
c390: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
c3a0: 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65    The top of the
c3b0: 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20   stack is the.  
c3c0: 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66    ** root page f
c3d0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
c3e0: 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73   (or a 0 if this
c3f0: 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20   is a view)..   
c400: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
c410: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c420: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
c430: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
c440: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
c450: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
c460: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
c470: 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
c480: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
c490: 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
c4a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
c4b0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
c4c0: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
c4d0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c4e0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c4f0: 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
c500: 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
c510: 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
c520: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
c530: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
c540: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
c550: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
c560: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
c570: 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
c580: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c590: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
c5a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
c5b0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
c5c0: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
c5d0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
c5e0: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
c5f0: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
c600: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
c610: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c620: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
c630: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
c640: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
c650: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
c660: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
c670: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
c680: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c690: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
c6a0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
c6b0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
c6c0: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
c6d0: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
c6e0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
c6f0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
c700: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
c710: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
c720: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
c730: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
c740: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
c750: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
c760: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
c770: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
c780: 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20   iDb, 0, 0,.    
c790: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c7a0: 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
c7b0: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
c7c0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
c7d0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
c7e0: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
c7f0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
c800: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
c810: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
c820: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
c830: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
c840: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
c850: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
c860: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53  y *pFKey; .    S
c870: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
c880: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
c890: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
c8a0: 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
c8b0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
c8c0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65      sqlite3Strle
c8f0: 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  n30(p->zName)+1,
c900: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
c910: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c920: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
c930: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
c940: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
c950: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
c960: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
c970: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
c980: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c9a0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
c9b0: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
c9c0: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
c9d0: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
c9e0: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 76 6f  tFrom){.      vo
c9f0: 69 64 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20  id *data;.      
ca00: 69 6e 74 20 6e 54 6f 20 3d 20 73 71 6c 69 74 65  int nTo = sqlite
ca10: 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d  3Strlen30(pFKey-
ca20: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
ca30: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
ca40: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
ca50: 64 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  d(&pSchema->aFKe
ca60: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
ca70: 54 6f 29 3b 0a 20 20 20 20 20 20 64 61 74 61 20  To);.      data 
ca80: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
ca90: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46  ert(&pSchema->aF
caa0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
cab0: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
cac0: 20 20 20 20 69 66 28 20 64 61 74 61 3d 3d 28 76      if( data==(v
cad0: 6f 69 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a 20  oid *)pFKey ){. 
cae0: 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
caf0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
cb00: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
cb10: 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  f.    pParse->pN
cb20: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
cb30: 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20   db->nTable++;. 
cb40: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
cb50: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
cb60: 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  nges;..#ifndef S
cb70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
cb80: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70  TABLE.    if( !p
cb90: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
cba0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cbb0: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
cbc0: 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61  ar *)pParse->sNa
cbd0: 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  meToken.z;.     
cbe0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20   int nName;.    
cbf0: 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65    assert( !pSele
cc00: 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70  ct && pCons && p
cc10: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  End );.      if(
cc20: 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a   pCons->z==0 ){.
cc30: 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20          pCons = 
cc40: 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pEnd;.      }.  
cc50: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74      nName = (int
cc60: 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  )((const char *)
cc70: 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65  pCons->z - zName
cc80: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43  );.      p->addC
cc90: 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20  olOffset = 13 + 
cca0: 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
ccb0: 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  en(zName, nName)
ccc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ccd0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
cce0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
ccf0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
cd00: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
cd10: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
cd20: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
cd30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cd40: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
cd50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
cd60: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
cd70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
cd80: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
cd90: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
cda0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
cdb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
cdc0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
cdd0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
cde0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
cdf0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
ce00: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
ce10: 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
ce20: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
ce30: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
ce40: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
ce50: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
ce60: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
ce70: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
ce80: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
ce90: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
cea0: 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
ceb0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
cec0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
ced0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
cee0: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
cef0: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
cf00: 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
cf10: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
cf20: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
cf30: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
cf40: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
cf50: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
cf60: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
cf70: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b  Name;.  int iDb;
cf80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cf90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
cfa0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
cfb0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
cfc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
cfd0: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
cfe0: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
cff0: 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71   views");.    sq
d000: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d010: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d020: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d030: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
d040: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
d050: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
d060: 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
d070: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
d080: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
d090: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
d0a0: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
d0b0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
d0c0: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
d0d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
d0e0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
d0f0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
d100: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
d110: 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
d120: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
d130: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
d140: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
d150: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
d160: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
d170: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
d180: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
d190: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
d1a0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
d1b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d1c0: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d1d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
d1e0: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
d1f0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
d200: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
d210: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
d220: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
d230: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
d240: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
d250: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
d260: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
d270: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
d280: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
d290: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
d2a0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
d2b0: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
d2c0: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
d2d0: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
d2e0: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
d2f0: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
d300: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
d310: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
d320: 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
d330: 5f 52 45 44 55 43 45 29 3b 0a 20 20 73 71 6c 69  _REDUCE);.  sqli
d340: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d350: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d360: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d370: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
d380: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  rn;.  }.  if( !d
d390: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
d3a0: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
d3b0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
d3c0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
d3d0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
d3e0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
d3f0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
d400: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
d410: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
d420: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
d430: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
d440: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
d450: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
d460: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
d470: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
d480: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
d490: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
d4a0: 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
d4b0: 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  ->z);.  z = (con
d4c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
d4d0: 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  *)pBegin->z;.  w
d4e0: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b  hile( n>0 && (z[
d4f0: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 73 71 6c  n-1]==';' || sql
d500: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
d510: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
d520: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
d530: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
d540: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
d550: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
d560: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
d570: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
d580: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
d590: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
d5a0: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
d5b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
d5c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d5d0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
d5e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
d5f0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
d600: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d610: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d620: 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
d630: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
d640: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
d650: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
d660: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
d670: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
d680: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
d690: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
d6a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d6b0: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
d6c0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
d6d0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
d6e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
d6f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
d700: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d710: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
d720: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
d730: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
d740: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
d750: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
d760: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
d770: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
d780: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
d790: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
d7a0: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
d7b0: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
d7c0: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
d7d0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
d7e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d7f0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
d800: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
d810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
d820: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
d830: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
d840: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
d850: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d860: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
d870: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d880: 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
d890: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
d8a0: 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69  (*xAuth)(void*,i
d8b0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
d8c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d8d0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d8e0: 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r*);..  assert( 
d8f0: 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
d900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d910: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
d920: 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  ( sqlite3VtabCal
d930: 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
d940: 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20   pTable) ){.    
d950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
d960: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  ROR;.  }.  if( I
d970: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
d980: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
d990: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
d9a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
d9b0: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
d9c0: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
d9d0: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
d9e0: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
d9f0: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
da00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
da10: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
da20: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
da30: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
da40: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
da50: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
da60: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
da70: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
da80: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
da90: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
daa0: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
dab0: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
dac0: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
dad0: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
dae0: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
daf0: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
db00: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
db10: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
db20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
db30: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
db40: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
db50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
db60: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
db70: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
db80: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
db90: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
dba0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
dbb0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
dbc0: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
dbd0: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
dbe0: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
dbf0: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
dc00: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
dc10: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
dc20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
dc30: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
dc40: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
dc50: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
dc60: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
dc70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
dc80: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20  pTable->nCol>=0 
dc90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  );..  /* If we g
dca0: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
dcb0: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
dcc0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
dcd0: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
dce0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
dcf0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
dd00: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
dd10: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
dd20: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
dd30: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
dd40: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
dd50: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
dd60: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
dd70: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
dd80: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
dd90: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
dda0: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
ddb0: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
ddc0: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
ddd0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
dde0: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
ddf0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
de00: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
de10: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
de20: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
de30: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
de40: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
de50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
de60: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
de70: 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
de80: 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  Sel ){.    n = p
de90: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
dea0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
deb0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
dec0: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
ded0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
dee0: 6f 6c 20 3d 20 2d 31 3b 0a 23 69 66 6e 64 65 66  ol = -1;.#ifndef
def0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
df00: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
df10: 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
df20: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
df30: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
df40: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
df50: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
df60: 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
df70: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
df80: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
df90: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
dfa0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
dfb0: 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
dfc0: 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d  ndif.    pParse-
dfd0: 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69  >nTab = n;.    i
dfe0: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
dff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e000: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
e010: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
e020: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
e030: 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  l;.      pTable-
e040: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
e050: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
e060: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
e070: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
e080: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
e090: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
e0a0: 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  e(pSelTab);.    
e0b0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
e0c0: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
e0d0: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
e0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
e0f0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
e100: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
e110: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
e120: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e130: 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20  pSel);.  } else 
e140: 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
e150: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e160: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
e170: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
e180: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
e190: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e1a0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
e1b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e1c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
e1d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e1e0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
e1f0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
e200: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
e210: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
e220: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
e230: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
e240: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
e250: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
e260: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
e270: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
e280: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
e290: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
e2a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
e2b0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
e2c0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
e2d0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
e2e0: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
e2f0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
e300: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e310: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
e320: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
e330: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
e340: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
e350: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
e360: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
e370: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
e380: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
e390: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
e3a0: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
e3b0: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
e3c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e3d0: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
e3e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e3f0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
e400: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
e410: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
e420: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
e430: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
e440: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
e450: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
e460: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
e470: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
e480: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
e490: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
e4a0: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
e4b0: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
e4c0: 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
e4d0: 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
e4e0: 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
e4f0: 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
e500: 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
e510: 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
e520: 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
e530: 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
e540: 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
e550: 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
e560: 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
e570: 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
e580: 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
e590: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
e5a0: 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
e5b0: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
e5c0: 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
e5d0: 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
e5e0: 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
e5f0: 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
e600: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
e610: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
e620: 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
e630: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
e640: 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
e650: 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
e660: 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
e670: 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
e680: 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
e690: 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
e6a0: 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
e6b0: 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
e6c0: 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
e6d0: 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
e6e0: 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
e6f0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
e700: 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
e710: 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
e720: 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
e730: 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
e740: 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
e750: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e760: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
e770: 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
e780: 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69  Moved(Db *pDb, i
e790: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
e7a0: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
e7b0: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
e7c0: 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d  Hash;..  pHash =
e7d0: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
e7e0: 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
e7f0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
e800: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
e810: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
e820: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
e830: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
e840: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
e850: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
e860: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
e870: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
e880: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
e890: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
e8a0: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
e8b0: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
e8c0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
e8d0: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
e8e0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
e8f0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
e900: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
e910: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
e920: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
e930: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
e940: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
e950: 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
e960: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
e970: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
e980: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
e990: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
e9a0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
e9b0: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
e9c0: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
e9d0: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
e9e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e9f0: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
ea00: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
ea10: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
ea20: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
ea30: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
ea40: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
ea50: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
ea60: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
ea70: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
ea80: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
ea90: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
eaa0: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
eab0: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
eac0: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
ead0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
eae0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
eaf0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
eb00: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
eb10: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
eb20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
eb30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
eb40: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
eb50: 31 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66  1, iDb);.#ifndef
eb60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
eb70: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
eb80: 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
eb90: 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
eba0: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
ebb0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
ebc0: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
ebd0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ebe0: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
ebf0: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
ec00: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
ec10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
ec20: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
ec30: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ec40: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
ec50: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
ec60: 20 54 68 65 20 22 23 25 64 22 20 69 6e 20 74 68   The "#%d" in th
ec70: 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
ec80: 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
ec90: 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
eca0: 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e  value.  ** is on
ecb0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
ecc0: 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69  stack.  See sqli
ecd0: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
ece0: 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
ecf0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
ed00: 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
ed10: 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
ed20: 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
ed30: 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  %d AND rootpage=
ed40: 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73  #%d",.     pPars
ed50: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
ed60: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
ed70: 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65  BLE(iDb), iTable
ed80: 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69  , r1, r1);.#endi
ed90: 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
eda0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
edb0: 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
edc0: 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
edd0: 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
ede0: 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
edf0: 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
ee00: 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
ee10: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
ee20: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ee30: 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
ee40: 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
ee50: 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
ee60: 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
ee70: 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
ee80: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
ee90: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
eea0: 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
eeb0: 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
eec0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
eed0: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
eee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
eef0: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
ef00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
ef10: 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
ef20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ef30: 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
ef40: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44   *pIdx;.  int iD
ef50: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
ef60: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
ef70: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
ef80: 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  ma);.  destroyRo
ef90: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
efa0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Tab->tnum, iDb);
efb0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
efc0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
efd0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
efe0: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
eff0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
f000: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
f010: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
f020: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
f030: 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
f040: 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
f050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f060: 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
f070: 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
f080: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
f090: 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
f0a0: 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
f0b0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
f0c0: 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
f0d0: 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
f0e0: 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
f0f0: 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
f100: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
f110: 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
f120: 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
f130: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
f140: 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
f150: 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
f160: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
f170: 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
f180: 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
f190: 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
f1a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
f1b0: 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
f1c0: 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
f1d0: 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
f1e0: 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
f1f0: 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
f200: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
f210: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
f220: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
f230: 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
f240: 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
f250: 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
f260: 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
f270: 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
f280: 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
f290: 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
f2a0: 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
f2b0: 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
f2c0: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
f2d0: 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
f2e0: 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
f2f0: 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
f300: 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
f310: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
f320: 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
f330: 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
f340: 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
f350: 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
f360: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
f370: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
f380: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
f390: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f3a0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f3b0: 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
f3c0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
f3d0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
f3e0: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
f3f0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
f400: 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
f410: 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
f420: 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
f430: 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
f440: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
f450: 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
f460: 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
f470: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
f480: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
f490: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
f4a0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
f4b0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
f4c0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
f4d0: 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
f4e0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
f4f0: 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
f500: 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
f510: 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
f520: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
f530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f540: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
f550: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
f560: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
f570: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
f580: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
f590: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
f5a0: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
f5b0: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
f5c0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
f5d0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
f5e0: 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
f5f0: 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
f600: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
f610: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
f620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
f630: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
f640: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
f650: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
f660: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
f670: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f680: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
f690: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
f6a0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
f6b0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
f6c0: 73 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20  se, isView, .   
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e           pName->
f6f0: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
f700: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
f710: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
f720: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
f730: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
f740: 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70  ite3ErrorClear(p
f750: 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
f760: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f770: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
f780: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
f790: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
f7a0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
f7b0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
f7c0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
f7d0: 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73  .  /* If pTab is
f7e0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
f7f0: 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f  , call ViewGetCo
f800: 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65  lumnNames() to e
f810: 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  nsure.  ** it is
f820: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
f830: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
f840: 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  al(pTab) && sqli
f850: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
f860: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
f870: 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ab) ){.    goto 
f880: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f890: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
f8a0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
f8b0: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
f8c0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
f8d0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
f8e0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
f8f0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
f900: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
f910: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
f920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
f930: 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g2 = 0;.    if( 
f940: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f950: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
f960: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
f970: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
f980: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f990: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
f9a0: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
f9b0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
f9c0: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
f9d0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
f9e0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
f9f0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
fa00: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
fa10: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
fa20: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  EW;.      }.#ifn
fa30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fa40: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
fa50: 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
fa60: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
fa70: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
fa80: 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20  E_DROP_VTABLE;. 
fa90: 20 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61       zArg2 = pTa
faa0: 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  b->pMod->zName;.
fab0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
fac0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
fad0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
fae0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
faf0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
fb00: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
fb10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fb20: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
fb30: 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
fb40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
fb50: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
fb60: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
fb70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
fb80: 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
fb90: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
fba0: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
fbb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
fbc0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
fbd0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
fbe0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
fbf0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
fc00: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fc10: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
fc20: 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
fc30: 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
fc40: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
fc50: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , 7)==0 ){.    s
fc60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fc70: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
fc80: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
fc90: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
fca0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
fcb0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
fcc0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fcd0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
fce0: 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
fcf0: 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
fd00: 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
fd10: 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
fd20: 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
fd30: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
fd40: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
fd50: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
fd60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
fd70: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
fd80: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
fd90: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
fda0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
fdb0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fdc0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
fdd0: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
fde0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
fdf0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fe00: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
fe10: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
fe20: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
fe30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
fe40: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fe50: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
fe60: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
fe70: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
fe80: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
fe90: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
fea0: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
feb0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
fec0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
fed0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69  if( v ){.    Tri
fee0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
fef0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
ff00: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
ff10: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
ff20: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
ff30: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
ff40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ff50: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ff60: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
ff70: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
ff80: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 20  if( v ){.       
ff90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ffa0: 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
ffb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ffc0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
ffd0: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
ffe0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
fff0: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
10000 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
10010 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
10020 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
10030 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
10040 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
10050 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
10060 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
10070 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
10080 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
10090 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
100a0 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
100b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
100c0 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
100d0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
100e0 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  a || .          
100f0 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
10100 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
10110 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73  chema );.      s
10120 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
10130 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
10140 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54  igger);.      pT
10150 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
10160 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
10170 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10180 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
10190 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  NT.    /* Remove
101a0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
101b0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
101c0 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
101d0 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  ated with.    **
101e0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
101f0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
10200 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
10210 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
10220 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65  ed.    ** at the
10230 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
10240 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
10250 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
10260 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
10270 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
10280 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
10290 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
102a0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
102b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
102c0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
102d0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
102e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
102f0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10300 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
10310 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  ETE FROM %s.sqli
10320 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
10330 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
10340 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
10350 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
10360 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
10370 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  f..    /* Drop a
10380 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
10390 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
103a0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
103b0 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
103c0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
103d0 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
103e0 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
103f0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
10400 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
10410 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
10420 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
10430 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
10440 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
10450 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
10460 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
10470 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
10480 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
10490 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
104a0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
104b0 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
104c0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
104d0 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
104e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
104f0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
10500 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
10510 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44  rse, .        "D
10520 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
10530 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
10540 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
10550 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20  igger'",.       
10560 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
10570 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
10580 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
10590 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20 73     /* Drop any s
105a0 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20 74  tatistics from t
105b0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
105c0 74 61 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69  table, if it exi
105d0 73 74 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  sts */.    if( s
105e0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
105f0 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
10600 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  1", db->aDb[iDb]
10610 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
10620 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10630 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
10640 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
10650 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31   %Q.sqlite_stat1
10660 20 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c 20   WHERE tbl=%Q", 
10670 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  pDb->zName, pTab
10680 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
10690 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
106a0 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
106b0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
106c0 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c       destroyTabl
106d0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
106e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
106f0 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
10700 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
10710 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
10720 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
10730 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61     ** the schema
10740 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a   cookie..    */.
10750 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
10760 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
10770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10780 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
10790 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
107a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
107b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
107c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
107d0 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
107e0 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
107f0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
10800 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
10810 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
10820 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  }.  sqliteViewRe
10830 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
10840 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
10850 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
10860 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
10870 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
10880 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10890 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
108a0 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
108b0 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
108c0 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
108d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
108e0 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
108f0 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
10900 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
10910 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
10920 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
10930 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
10940 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
10950 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
10960 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
10970 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
10980 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
10990 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
109a0 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20  red to.  pToCol 
109b0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62  is a list of tab
109c0 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  les in the other
109d0 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68  .** pTo table th
109e0 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
109f0 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66  ey points to.  f
10a00 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
10a10 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
10a20 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
10a30 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
10a40 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
10a50 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
10a60 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
10a70 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
10a80 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
10a90 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
10aa0 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
10ab0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
10ac0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
10ad0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
10ae0 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
10af0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
10b00 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65  ld.  The new FKe
10b10 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b  y.** is not link
10b20 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65  ed into db->aFKe
10b30 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
10b40 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  - that does not 
10b50 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20  happen.** until 
10b60 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
10b70 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  )..**.** The for
10b80 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
10b90 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
10ba0 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
10bb0 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
10bc0 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
10bd0 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
10be0 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
10bf0 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
10c00 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
10c10 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
10c20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10c30 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10c40 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
10c50 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
10c60 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
10c70 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
10c80 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
10c90 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
10ca0 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
10cb0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
10cc0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
10cd0 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
10ce0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
10cf0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
10d00 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
10d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
10d20 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
10d30 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
10d40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
10d50 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
10d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10d70 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
10d80 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
10d90 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
10da0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10db0 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
10dc0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
10dd0 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
10de0 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
10df0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
10e00 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
10e10 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
10e20 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
10e30 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
10e40 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
10e50 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
10e60 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
10e70 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
10e80 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
10e90 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
10ea0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10eb0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10ec0 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
10ed0 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
10ee0 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
10ef0 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
10f00 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
10f10 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
10f20 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
10f30 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
10f40 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
10f50 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
10f60 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
10f70 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
10f80 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
10f90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10fa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
10fb0 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
10fc0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
10fd0 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
10fe0 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
10ff0 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
11000 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
11010 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
11020 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
11030 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
11040 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
11050 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
11060 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
11070 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
11080 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
11090 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
110a0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
110b0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
110c0 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
110d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
110e0 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
110f0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
11100 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
11110 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
11120 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11130 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
11140 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
11150 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
11160 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
11170 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
11180 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
11190 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
111a0 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
111b0 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61  y[1];.  pFKey->a
111c0 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43  Col = (struct sC
111d0 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d  olMap*)z;.  z +=
111e0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
111f0 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20  ColMap)*nCol;.  
11200 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
11210 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
11220 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
11230 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
11240 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
11250 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
11260 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  = 0;.  pFKey->nC
11270 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
11280 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
11290 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
112a0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
112b0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
112c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
112d0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
112e0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
112f0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
11300 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
11310 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11320 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
11330 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
11340 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
11350 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
11360 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
11370 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
11380 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
113a0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
113b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
113c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
113d0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
113e0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
113f0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
11400 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
11410 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
11420 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
11430 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
11440 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11450 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
11460 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
11470 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11480 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11490 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
114a0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
114b0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
114c0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
114d0 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
114e0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
114f0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
11500 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
11510 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
11520 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
11530 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
11540 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
11550 66 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  f = (u8)(flags &
11560 20 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d   0xff);.  pFKey-
11570 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 75  >updateConf = (u
11580 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29  8)((flags >> 8 )
11590 20 26 20 30 78 66 66 29 3b 0a 20 20 70 46 4b 65   & 0xff);.  pFKe
115a0 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
115b0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 31  (u8)((flags >> 1
115c0 36 20 29 20 26 20 30 78 66 66 29 3b 0a 0a 20 20  6 ) & 0xff);..  
115d0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
115e0 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
115f0 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
11600 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
11610 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
11620 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
11630 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
11640 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
11650 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
11660 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11670 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
11680 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11690 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
116a0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
116b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
116c0 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
116d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
116e0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
116f0 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
11700 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
11710 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
11720 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
11730 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
11740 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
11750 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
11760 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
11770 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
11780 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
11790 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
117a0 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
117b0 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
117c0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
117d0 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
117e0 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
117f0 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
11800 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
11810 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
11820 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
11830 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
11840 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
11850 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
11860 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
11870 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
11880 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
11890 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
118a0 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
118b0 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
118c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
118d0 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
118e0 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
118f0 3d 31 20 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  =1 );.  pFKey->i
11900 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29  sDeferred = (u8)
11910 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
11920 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
11930 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
11940 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
11950 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
11960 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
11970 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
11980 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
11990 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
119a0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
119b0 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
119c0 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
119d0 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
119e0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
119f0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
11a00 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
11a10 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
11a20 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
11a30 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69  eated.  The regi
11a40 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62  ster specified b
11a50 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
11a60 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
11a70 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
11a80 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
11a90 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
11aa0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
11ab0 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
11ac0 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
11ad0 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
11ae0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
11af0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
11b00 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
11b10 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
11b20 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
11b30 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
11b40 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
11b50 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
11b60 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
11b70 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
11b80 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
11b90 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
11ba0 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
11bb0 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
11bc0 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
11bd0 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
11be0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
11bf0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
11c00 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
11c10 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
11c20 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
11c30 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
11c40 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
11c50 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11c80 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
11c90 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
11cc0 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  f index */.  Vdb
11cd0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
11cf0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
11d00 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
11d10 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
11d20 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
11d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
11d40 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
11d50 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64 78 4b  */.  int regIdxK
11d60 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
11d70 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
11d80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11d90 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
11da0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11dc0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
11dd0 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64  g assemblied ind
11de0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
11df0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11e00 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
11e10 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
11e20 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
11e30 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
11e40 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
11e50 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
11e60 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
11e70 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11e80 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
11e90 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11ea0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
11eb0 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
11ec0 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
11ed0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
11ee0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
11ef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
11f00 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
11f10 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
11f20 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
11f30 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
11f40 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
11f50 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
11f60 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
11f70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
11f80 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
11f90 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
11fa0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
11fb0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
11fc0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
11fd0 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
11fe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
11ff0 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
12000 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
12010 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12020 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
12030 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  );.  }.  pKey = 
12040 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
12050 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64  nfo(pParse, pInd
12060 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ex);.  sqlite3Vd
12070 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
12080 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
12090 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20  tnum, iDb, .    
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
120c0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
120d0 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
120e0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73  Page>=0 ){.    s
120f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12100 50 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  P5(v, 1);.  }.  
12110 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
12120 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
12130 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
12140 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
12150 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12160 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12170 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72 65  , iTab, 0);.  re
12180 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
12190 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
121a0 73 65 29 3b 0a 20 20 72 65 67 49 64 78 4b 65 79  se);.  regIdxKey
121b0 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61   = sqlite3Genera
121c0 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
121d0 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c  e, pIndex, iTab,
121e0 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
121f0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e    if( pIndex->on
12200 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
12210 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32  {.    int j1, j2
12220 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  ;.    int regRow
12230 69 64 3b 0a 0a 20 20 20 20 72 65 67 52 6f 77 69  id;..    regRowi
12240 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20  d = regIdxKey + 
12250 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
12260 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
12270 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12280 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78  P_IsNull, regIdx
12290 4b 65 79 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  Key, 0, pIndex->
122a0 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32  nColumn);.    j2
122b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
122c0 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69  dOp4(v, OP_IsUni
122d0 71 75 65 2c 20 69 49 64 78 2c 0a 20 20 20 20 20  que, iIdx,.     
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 20 20 20 20 30 2c 20 72 65 67 52 6f 77 69        0, regRowi
12300 64 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  d, SQLITE_INT_TO
12310 5f 50 54 52 28 72 65 67 52 65 63 6f 72 64 29 2c  _PTR(regRecord),
12320 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
12330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12340 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
12350 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
12360 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20   OE_Abort, 0,.  
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
12390 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
123a0 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  e", P4_STATIC);.
123b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
123c0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
123d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
123e0 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a  umpHere(v, j2);.
123f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
12410 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
12420 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
12430 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12440 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
12450 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
12460 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12470 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
12480 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r1+1);.  sqlite3
12490 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
124a0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
124b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
124c0 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
124d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
124e0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
124f0 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iIdx);.}../*.**
12500 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
12510 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
12520 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
12530 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
12540 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
12550 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
12560 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
12570 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
12580 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
12590 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
125a0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
125b0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
125c0 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
125d0 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
125e0 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
125f0 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
12600 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
12610 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
12620 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
12630 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
12640 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
12650 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
12660 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
12670 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
12680 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
12690 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
126a0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
126b0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
126c0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
126d0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
126e0 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
126f0 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
12700 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
12710 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
12720 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
12730 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
12740 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
12750 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
12760 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
12770 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
12780 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
12790 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
127a0 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
127b0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
127c0 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
127d0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
127e0 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
127f0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
12800 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
12810 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
12820 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
12830 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
12840 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
12850 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
12860 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
12870 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
12880 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
12890 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
128a0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
128b0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
128c0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
128d0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
128e0 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
128f0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
12900 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
12910 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
12920 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
12930 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
12940 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
12950 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
12960 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
12970 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
12980 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
12990 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
129a0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
129b0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
129c0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
129d0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
129e0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
129f0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
12a00 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
12a10 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
12a20 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
12a30 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
12a40 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
12a50 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
12a60 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
12a70 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
12a80 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
12a90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
12aa0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
12ab0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
12ac0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
12ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12ae0 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
12af0 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
12b00 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
12b10 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
12b20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
12b30 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
12b40 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
12b50 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
12b60 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
12b70 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
12b80 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
12b90 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
12ba0 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
12bb0 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
12bc0 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
12bd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12be0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
12bf0 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
12c00 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
12c10 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
12c20 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
12c30 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
12c40 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
12c50 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12c60 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
12c70 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
12c80 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
12c90 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
12ca0 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
12cb0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
12cc0 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
12cd0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
12ce0 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
12cf0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
12d00 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
12d10 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
12d20 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
12d30 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
12d40 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
12d50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12d60 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
12d70 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
12d80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12d90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12da0 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
12db0 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
12dc0 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
12dd0 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
12de0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
12df0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
12e00 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
12e10 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
12e20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12e30 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
12e40 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
12e50 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
12e60 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
12e70 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
12e80 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
12e90 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
12ea0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12eb0 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
12ec0 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
12ed0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
12ee0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
12ef0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
12f00 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
12f10 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
12f20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69  reate_index;..#i
12f30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12f40 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
12f50 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
12f60 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
12f70 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
12f80 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
12f90 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
12fa0 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
12fb0 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
12fc0 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
12fd0 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
12fe0 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
12ff0 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
13000 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
13010 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
13020 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
13030 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
13040 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
13050 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20       if( pName2 
13060 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  && pName2->n==0 
13070 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
13080 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
13090 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
130a0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
130b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
130c0 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
130d0 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
130e0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
130f0 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
13100 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
13110 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
13120 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
13130 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
13140 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
13150 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
13160 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
13170 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
13180 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
13190 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
131a0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
131b0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
131c0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
131d0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
131e0 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ble(pParse, 0, p
131f0 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
13200 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
13210 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
13220 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
13230 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61   !pTab || db->ma
13240 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
13250 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13260 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
13270 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
13280 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
13290 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hema );.  }else{
132a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
132b0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
132c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
132d0 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
132e0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
132f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13300 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13310 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
13320 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13330 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
13340 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
13350 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
13360 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
13370 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13380 6e 64 65 78 3b 0a 20 20 69 66 28 20 73 71 6c 69  ndex;.  if( sqli
13390 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
133a0 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
133b0 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20  _", 7)==0 .     
133c0 20 20 26 26 20 6d 65 6d 63 6d 70 28 26 70 54 61    && memcmp(&pTa
133d0 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74  b->zName[7],"alt
133e0 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b  ertab_",9)!=0 ){
133f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13400 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
13410 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
13420 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
13430 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
13440 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13450 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
13460 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13470 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  EW.  if( pTab->p
13480 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
13490 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
134a0 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
134b0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
134c0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
134d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
134e0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
134f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13500 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
13510 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
13520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13530 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13540 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  "virtual tables 
13550 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
13560 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
13570 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13580 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13590 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
135a0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
135b0 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
135c0 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
135d0 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
135e0 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
135f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
13600 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
13610 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
13620 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
13630 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
13640 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
13650 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
13660 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
13670 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
13680 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
13690 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
136a0 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
136b0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
136c0 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
136d0 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
136e0 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
136f0 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
13700 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
13710 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
13720 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
13730 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
13740 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
13750 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
13760 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
13770 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
13780 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
13790 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
137a0 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
137b0 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
137c0 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
137d0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
137e0 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
137f0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
13800 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
13810 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
13820 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13830 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
13840 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
13850 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13860 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
13870 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
13880 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
13890 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
138a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
138b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
138c0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
138d0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
138e0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
138f0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
13900 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
13910 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13920 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ex;.      if( sq
13930 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
13940 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
13950 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13960 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13970 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
13980 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
13990 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
139a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
139b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
139c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
139d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
139e0 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
139f0 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
13a00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
13a10 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
13a20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13a30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
13a40 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
13a50 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
13a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
13a70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13a80 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
13a90 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
13aa0 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
13ab0 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
13ac0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
13ad0 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
13ae0 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
13af0 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
13b00 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13b10 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
13b20 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
13b30 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
13b40 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
13b50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13b60 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13b80 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
13b90 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
13ba0 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
13bb0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13bc0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
13bd0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
13be0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
13bf0 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
13c00 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
13c10 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
13c20 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
13c30 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
13c40 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
13c50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13c60 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
13c70 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
13c80 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
13c90 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
13ca0 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
13cb0 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
13cc0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
13cd0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
13ce0 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
13cf0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
13d00 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
13d10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13d20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
13d30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
13d40 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
13d50 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
13d60 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
13d70 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
13d80 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
13d90 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
13da0 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
13db0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
13dc0 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
13dd0 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
13de0 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
13df0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
13e00 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
13e10 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62  Id.z = (u8*)pTab
13e20 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
13e30 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
13e40 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c 69 74  nullId.n = sqlit
13e50 65 33 53 74 72 6c 65 6e 33 30 28 28 63 68 61 72  e3Strlen30((char
13e60 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  *)nullId.z);.   
13e70 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
13e80 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
13e90 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 6e 75  Parse, 0, 0, &nu
13ea0 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
13eb0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
13ec0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13ed0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
13ee0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
13ef0 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  8)sortOrder;.  }
13f00 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
13f10 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
13f20 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
13f30 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
13f40 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
13f50 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
13f60 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
13f70 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
13f80 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
13f90 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
13fa0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 43  pr *pExpr;.    C
13fb0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
13fc0 20 20 20 69 66 28 20 28 70 45 78 70 72 20 3d 20     if( (pExpr = 
13fd0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
13fe0 72 29 21 3d 30 20 26 26 20 28 70 43 6f 6c 6c 20  r)!=0 && (pColl 
13ff0 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 21  = pExpr->pColl)!
14000 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
14010 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
14020 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c  e3Strlen30(pColl
14030 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
14040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
14050 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
14060 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
14070 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
14080 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
14090 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20  Name);.  nCol = 
140a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
140b0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
140c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
140d0 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49   .      sizeof(I
140e0 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20 20 20  ndex) +         
140f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
14100 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20  ructure  */.    
14110 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43    sizeof(int)*nC
14120 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ol +           /
14130 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
14140 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
14150 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29  of(int)*(nCol+1)
14160 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65   +       /* Inde
14170 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a  x.aiRowEst   */.
14180 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61        sizeof(cha
14190 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  r *)*nCol +     
141a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
141b0 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
141c0 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20  sizeof(u8)*nCol 
141d0 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
141e0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
141f0 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20   */.      nName 
14200 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
14210 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
14220 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20  zName      */.  
14230 20 20 20 20 6e 45 78 74 72 61 20 20 20 20 20 20      nExtra      
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14250 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
14260 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a  quence names */.
14270 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
14280 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14290 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
142a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
142b0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20   pIndex->azColl 
142c0 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64  = (char**)(&pInd
142d0 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78  ex[1]);.  pIndex
142e0 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
142f0 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a  t *)(&pIndex->az
14300 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  Coll[nCol]);.  p
14310 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
14320 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26  = (unsigned *)(&
14330 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
14340 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
14350 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
14360 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  (u8 *)(&pIndex->
14370 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d  aiRowEst[nCol+1]
14380 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
14390 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  me = (char *)(&p
143a0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
143b0 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74  r[nCol]);.  zExt
143c0 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  ra = (char *)(&p
143d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61  Index->zName[nNa
143e0 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  me+1]);.  memcpy
143f0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
14400 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
14410 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
14420 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
14430 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
14440 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
14450 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
14460 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
14470 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
14480 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30   = (u8)(pName==0
14490 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  );.  pIndex->pSc
144a0 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
144b0 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20  Db].pSchema;..  
144c0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
144d0 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
144e0 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
144f0 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
14500 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
14510 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
14520 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
14530 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
14540 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
14550 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
14560 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
14570 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
14580 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
14590 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
145a0 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
145b0 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
145c0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
145d0 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
145e0 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
145f0 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
14600 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
14610 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
14620 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
14630 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
14640 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69  /.  for(i=0, pLi
14650 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b  stItem=pList->a;
14660 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14670 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
14680 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
14690 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70  ar *zColName = p
146a0 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  ListItem->zName;
146b0 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  .    Column *pTa
146c0 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65  bCol;.    int re
146d0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
146e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
146f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14700 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
14710 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
14720 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c  */..    for(j=0,
14730 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
14740 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
14750 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b  l; j++, pTabCol+
14760 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
14770 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
14780 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e  lName, pTabCol->
14790 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
147a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
147b0 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
147c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
147d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
147e0 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f  "table %s has no
147f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73   column named %s
14800 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
14810 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65  >zName, zColName
14820 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
14830 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14840 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f  .    }.    /* TO
14850 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20  DO:  Add a test 
14860 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
14870 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
14880 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20  n is not named. 
14890 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20     ** more than 
148a0 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
148b0 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
148c0 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
148d0 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  ance of.    ** t
148e0 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65  he column will e
148f0 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74  ver be used by t
14900 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e  he optimizer.  N
14910 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74  ote that using t
14920 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 63  he.    ** same c
14930 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
14940 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
14950 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
14960 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 20 20  that would .    
14970 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72  ** break backwar
14980 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
14990 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62   - it needs to b
149a0 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20  e a warning..   
149b0 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   */.    pIndex->
149c0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
149d0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
149e0 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 70 4c 69  em->pExpr && pLi
149f0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
14a00 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 73  Coll ){.      as
14a10 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d  sert( pListItem-
14a20 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  >pExpr->pColl );
14a30 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
14a40 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 71 6c  Extra;.      sql
14a50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45  ite3_snprintf(nE
14a60 78 74 72 61 2c 20 7a 45 78 74 72 61 2c 20 22 25  xtra, zExtra, "%
14a70 73 22 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  s", pListItem->p
14a80 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61  Expr->pColl->zNa
14a90 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  me);.      zExtr
14aa0 61 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  a += (sqlite3Str
14ab0 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31  len30(zColl) + 1
14ac0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14ad0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
14ae0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
14af0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
14b00 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  l ){.        zCo
14b10 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
14b20 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
14b30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14b40 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
14b50 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
14b60 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
14b70 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20   zColl, -1) ){. 
14b80 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14b90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14ba0 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
14bb0 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
14bc0 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
14bd0 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
14be0 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
14bf0 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
14c00 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
14c10 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38  rtOrder[i] = (u8
14c20 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72  )requestedSortOr
14c30 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  der;.  }.  sqlit
14c40 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
14c50 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20  pIndex);..  if( 
14c60 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
14c70 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
14c80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
14c90 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
14ca0 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
14cb0 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
14cc0 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
14cd0 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
14ce0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
14cf0 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
14d00 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
14d10 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
14d20 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
14d30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
14d40 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
14d50 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
14d60 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
14d70 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
14d80 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
14d90 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
14da0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
14db0 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
14dc0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
14dd0 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
14de0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
14df0 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
14e00 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
14e10 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
14e20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
14e30 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
14e40 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
14e50 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
14e60 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
14e70 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
14e80 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
14e90 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
14ea0 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
14eb0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
14ec0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
14ed0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
14ee0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
14ef0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
14f00 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
14f10 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
14f20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
14f30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14f40 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
14f50 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
14f60 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
14f70 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
14f80 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14f90 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
14fa0 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
14fb0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
14fc0 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
14fd0 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
14fe0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14ff0 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
15000 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  [k];.        con
15010 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 70 49  st char *z2 = pI
15020 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
15030 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
15040 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
15050 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
15060 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
15070 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
15080 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49  SortOrder[k]!=pI
15090 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
150a0 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
150b0 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20       if( z1!=z2 
150c0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
150d0 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
150e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
150f0 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43   if( k==pIdx->nC
15100 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
15110 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
15120 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
15130 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
15140 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
15150 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
15160 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
15170 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
15180 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
15190 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
151a0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
151b0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
151c0 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
151d0 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
151e0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
151f0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
15200 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
15210 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
15220 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
15230 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
15240 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
15250 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
15260 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
15270 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
15280 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
15290 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
152a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
152b0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
152c0 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72  ed behaviour for
152d0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
152e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
152f0 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
15300 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
15310 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
15320 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
15330 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
15340 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15350 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
15360 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
15370 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
15380 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
15390 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
153a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
153b0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
153c0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
153d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
153e0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
153f0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
15400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
15420 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
15430 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
15440 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
15450 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
15460 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
15470 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
15480 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
15490 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
154a0 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
154b0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
154c0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
154d0 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
154e0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
154f0 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
15500 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
15530 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
15540 72 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a  rlen30(pIndex->z
15550 4e 61 6d 65 29 2b 31 2c 0a 20 20 20 20 20 20 20  Name)+1,.       
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20     pIndex);.    
15580 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
15590 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
155a0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
155b0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
155c0 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
155d0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
155e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
155f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15600 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
15610 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
15620 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
15630 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
15640 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
15650 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
15660 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
15670 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
15680 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
15690 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
156a0 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
156b0 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
156c0 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
156d0 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
156e0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
156f0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
15700 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
15710 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
15720 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
15730 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
15740 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
15750 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
15760 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
15770 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
15780 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
15790 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
157a0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
157b0 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
157c0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
157d0 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
157e0 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
157f0 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
15800 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
15810 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
15820 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
15830 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
15840 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
15850 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
15860 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
15870 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
15880 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
15890 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
158a0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
158b0 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
158c0 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
158d0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
158e0 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
158f0 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
15900 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
15910 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
15920 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
15930 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
15940 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
15950 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
15960 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
15970 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
15980 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
15990 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
159a0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
159b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
159c0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
159d0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
159e0 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
159f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
15a00 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
15a10 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
15a20 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
15a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
15a40 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
15a50 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
15a60 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
15a70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15a80 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
15a90 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
15aa0 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
15ab0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
15ac0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
15ad0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
15ae0 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
15af0 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
15b00 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
15b10 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
15b20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
15b30 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
15b40 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
15b50 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
15b60 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
15b70 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
15b80 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
15b90 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
15ba0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
15bb0 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
15bc0 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a  .        pEnd->z
15bd0 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c   - pName->z + 1,
15be0 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
15bf0 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
15c00 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
15c10 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
15c20 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
15c30 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
15c40 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
15c50 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
15c60 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
15c70 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
15c80 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
15c90 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
15ca0 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
15cb0 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
15cc0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
15cd0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
15ce0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
15cf0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
15d00 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
15d10 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22  ,%Q,%Q,#%d,%Q);"
15d20 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
15d30 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
15d40 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
15d50 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
15d60 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
15d70 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
15d80 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
15d90 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
15da0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15db0 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20  e(db, zStmt);.. 
15dc0 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
15dd0 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
15de0 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
15df0 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
15e00 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
15e10 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
15e20 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
15e30 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
15e40 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
15e50 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
15e60 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
15e70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
15e80 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
15e90 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
15ea0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
15eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ec0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
15ed0 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
15ee0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
15ef0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
15f00 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e  "name='%q'", pIn
15f10 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f  dex->zName), P4_
15f20 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
15f30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f40 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
15f50 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
15f60 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
15f70 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
15f80 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
15f90 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
15fa0 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
15fb0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
15fc0 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
15fd0 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
15fe0 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
15ff0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
16000 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
16010 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
16020 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20  tion of UPDATE. 
16030 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a   ** and INSERT..
16040 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
16050 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
16060 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
16070 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
16080 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
16090 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
160a0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
160b0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
160c0 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
160d0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
160e0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
160f0 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
16100 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
16110 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
16120 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
16130 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
16140 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
16150 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
16160 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
16170 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
16180 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
16190 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
161a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
161b0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
161c0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
161d0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
161e0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
161f0 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
16200 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
16210 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
16220 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
16230 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
16240 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49  dex ){.    freeI
16250 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
16260 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  }.  sqlite3ExprL
16270 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
16280 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
16290 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
162a0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
162b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
162c0 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
162d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
162e0 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65  ate code to make
162f0 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 66   sure the file f
16300 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20  ormat number is 
16310 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d  at least minForm
16320 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72  at..** The gener
16330 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69  ated code will i
16340 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
16350 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69   format number i
16360 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
16370 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69  void sqlite3Mini
16380 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61  mumFileFormat(Pa
16390 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
163a0 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72   iDb, int minFor
163b0 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  mat){.  Vdbe *v;
163c0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
163d0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
163e0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e   if( v ){.    in
163f0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
16400 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16410 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73  ;.    int r2 = s
16420 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16430 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e  (pParse);.    in
16440 74 20 6a 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  t j1;.    sqlite
16450 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16460 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
16470 62 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 73  b, r1, 1);.    s
16480 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
16490 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
164a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
164b0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
164c0 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 72 32 29  , minFormat, r2)
164d0 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
164e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
164f0 4f 50 5f 47 65 2c 20 72 32 2c 20 30 2c 20 72 31  OP_Ge, r2, 0, r1
16500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16510 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
16520 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  etCookie, iDb, 1
16530 2c 20 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r2);.    sqlit
16540 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
16550 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
16560 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16570 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16580 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16590 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
165a0 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r2);.  }.}../*.*
165b0 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
165c0 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
165d0 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
165e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
165f0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
16600 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
16610 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
16620 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
16630 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
16640 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
16650 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
16660 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
16670 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
16680 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
16690 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
166a0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
166b0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
166c0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
166d0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
166e0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
166f0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
16700 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
16710 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
16720 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
16730 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
16740 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
16750 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
16760 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
16770 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
16780 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
16790 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
167a0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
167b0 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
167c0 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
167d0 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
167e0 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
167f0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
16800 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
16810 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
16820 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
16830 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
16840 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
16850 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
16860 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
16870 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
16880 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
16890 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
168a0 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
168b0 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
168c0 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
168d0 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
168e0 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
168f0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
16900 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
16910 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
16920 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  ed *a = pIdx->ai
16930 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
16940 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
16950 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
16960 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64  000;.  for(i=pId
16970 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35  x->nColumn; i>=5
16980 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i--){.    a[i]
16990 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 5;.  }.  whil
169a0 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61  e( i>=1 ){.    a
169b0 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20  [i] = 11 - i;.  
169c0 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28    i--;.  }.  if(
169d0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
169e0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
169f0 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
16a00 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
16a10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
16a20 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
16a30 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
16a40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
16a50 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
16a60 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
16a70 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
16a80 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
16a90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16aa0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
16ab0 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
16ac0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
16ad0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  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 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
16b00 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
16b10 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
16b20 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
16b30 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
16b40 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
16b50 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
16b60 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
16b70 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
16b80 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
16b90 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
16ba0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16bb0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
16bc0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
16bd0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
16be0 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
16bf0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
16c00 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
16c10 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
16c20 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
16c30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16c40 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
16c50 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
16c60 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
16c70 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
16c80 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
16c90 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
16ca0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
16cb0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
16cc0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16cd0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
16ce0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
16cf0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
16d00 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
16d10 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
16d20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
16d30 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
16d40 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16d50 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
16d60 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
16d70 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
16d80 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
16d90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
16da0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
16db0 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
16dc0 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
16dd0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
16de0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
16df0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16e00 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
16e10 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
16e20 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
16e30 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
16e40 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
16e50 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16e60 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
16e70 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
16e80 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
16e90 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
16ea0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
16eb0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
16ec0 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
16ed0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
16ee0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
16ef0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16f00 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
16f10 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
16f20 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
16f30 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
16f40 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
16f50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
16f60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16f70 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
16f80 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
16f90 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
16fa0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16fb0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16fc0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
16fd0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
16fe0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
16ff0 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
17000 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
17010 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17020 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
17030 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
17040 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
17050 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
17060 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
17070 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
17080 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
17090 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
170a0 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
170b0 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44  e_stat1", db->aD
170c0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b  b[iDb].zName) ){
170d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
170e0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
170f0 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
17100 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
17110 5f 73 74 61 74 31 20 57 48 45 52 45 20 69 64 78  _stat1 WHERE idx
17120 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64 62  =%Q",.        db
17130 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
17140 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a  , pIndex->zName.
17150 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
17160 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
17170 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
17180 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
17190 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
171a0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
171b0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
171c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
171d0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
171e0 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
171f0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
17200 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
17210 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17220 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
17230 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
17240 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
17250 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
17260 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62  bjects.  Each ob
17270 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
17280 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
17290 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20  bytes in size.  
172a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
172b0 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  ocates a new.** 
172c0 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e  object on the en
172d0 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  d of the array..
172e0 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69  **.** *pnEntry i
172f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17300 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20  entries already 
17310 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f  in use.  *pnAllo
17320 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76  c is.** the prev
17330 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
17340 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
17350 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73  ay.  initSize is
17360 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65   the.** suggeste
17370 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20  d initial array 
17380 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  size allocation.
17390 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
173a0 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
173b0 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  y is returned in
173c0 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pIdx..**.** Th
173d0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
173e0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
173f0 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a  the array of obj
17400 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  ects.  This.** m
17410 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
17420 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70   as the pArray p
17430 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d  arameter or it m
17440 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72  ight be a differ
17450 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  ent.** pointer i
17460 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20  f the array was 
17470 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64  resized..*/.void
17480 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
17490 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
174a0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
174b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
174c0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
174d0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
174e0 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
174f0 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
17500 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
17510 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
17520 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
17530 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
17540 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
17550 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69  ray */.  int ini
17560 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75  tSize,     /* Su
17570 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20  ggested initial 
17580 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
17590 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
175a0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
175b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
175c0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
175d0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
175e0 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43  nAlloc,     /* C
175f0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
17600 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
17610 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
17620 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
17630 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
17640 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
17650 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
17660 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a  char *z;.  if( *
17670 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c  pnEntry >= *pnAl
17680 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  loc ){.    void 
17690 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
176a0 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53  ewSize;.    newS
176b0 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29  ize = (*pnAlloc)
176c0 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
176d0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
176e0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
176f0 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73  Array, newSize*s
17700 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
17710 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
17720 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
17730 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
17740 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  y;.    }.    *pn
17750 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
17760 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
17770 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20  pNew)/szEntry;. 
17780 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
17790 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
177a0 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
177b0 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20  set(&z[*pnEntry 
177c0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
177d0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
177e0 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b   = *pnEntry;.  +
177f0 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
17800 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
17810 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
17820 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
17830 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
17840 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
17850 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
17860 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
17870 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
17880 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
17890 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
178a0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
178b0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c  IdListAppend(sql
178c0 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
178d0 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
178e0 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
178f0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
17900 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
17910 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
17920 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
17930 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
17940 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
17950 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
17960 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
17970 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
17980 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
17990 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
179a0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
179b0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
179c0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
179d0 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  5,.      &pList-
179e0 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69  >nId,.      &pLi
179f0 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  st->nAlloc,.    
17a00 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
17a10 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
17a20 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
17a30 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
17a40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
17a50 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
17a60 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
17a70 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
17a80 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
17a90 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
17aa0 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
17ab0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
17ac0 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
17ad0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
17ae0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
17af0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
17b00 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
17b10 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
17b20 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
17b30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17b40 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
17b50 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
17b60 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
17b70 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
17b80 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
17b90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
17ba0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
17bb0 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
17bc0 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
17bd0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
17be0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
17bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
17c00 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
17c10 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
17c20 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
17c30 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
17c40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
17c50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
17c60 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
17c70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
17c80 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
17c90 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
17ca0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
17cb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
17cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
17cd0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
17ce0 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
17cf0 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
17d00 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
17d10 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
17d20 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
17d30 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
17d40 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
17d50 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
17d60 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
17d70 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
17d80 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
17d90 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
17da0 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
17db0 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
17dc0 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
17dd0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
17de0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
17df0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
17e00 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
17e10 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
17e20 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
17e30 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
17e40 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
17e50 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
17e60 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
17e70 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
17e80 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
17e90 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
17ea0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
17eb0 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
17ec0 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
17ed0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
17ee0 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
17ef0 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
17f00 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
17f10 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
17f20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
17f30 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
17f40 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
17f50 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
17f60 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
17f70 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
17f80 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
17f90 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
17fa0 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
17fb0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
17fc0 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
17fd0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
17fe0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
17ff0 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
18000 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
18010 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
18020 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
18030 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
18040 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
18050 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
18060 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
18070 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
18080 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
18090 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
180a0 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
180b0 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
180c0 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
180d0 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
180e0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
180f0 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
18100 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
18110 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
18120 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
18130 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 7c  .  if( pSrc==0 |
18140 7c 20 69 53 74 61 72 74 3e 70 53 72 63 2d 3e 6e  | iStart>pSrc->n
18150 53 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Src ){.    asser
18160 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
18170 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
18180 6e 20 70 53 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  n pSrc;.  }..  /
18190 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
181a0 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
181b0 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  eeded */.  if( p
181c0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
181d0 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  >pSrc->nAlloc ){
181e0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
181f0 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c  ew;.    int nAll
18200 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b  oc = pSrc->nSrc+
18210 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20  nExtra;.    int 
18220 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d  nGot;.    pNew =
18230 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
18240 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
18250 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
18260 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
18270 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
18280 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
18290 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
182a0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
182b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
182c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53  .      return pS
182d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  rc;.    }.    pS
182e0 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e  rc = pNew;.    n
182f0 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62  Got = (sqlite3Db
18300 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
18310 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70  New) - sizeof(*p
18320 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72  Src))/sizeof(pSr
18330 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20  c->a[0])+1;.    
18340 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  pSrc->nAlloc = (
18350 75 31 36 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  u16)nGot;.  }.. 
18360 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
18370 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
18380 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
18390 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
183a0 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
183b0 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
183c0 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
183d0 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
183e0 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
183f0 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
18400 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
18410 53 72 63 20 2b 3d 20 28 69 31 36 29 6e 45 78 74  Src += (i16)nExt
18420 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
18430 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
18440 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
18450 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
18460 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
18470 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
18480 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
18490 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
184a0 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
184b0 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
184c0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
184d0 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
184e0 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
184f0 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
18500 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
18510 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
18520 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
18530 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
18540 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
18550 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
18560 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
18570 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
18580 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
18590 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
185a0 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
185b0 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
185c0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
185d0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
185e0 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
185f0 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
18600 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
18610 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
18620 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
18630 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
18640 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
18650 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
18660 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
18670 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
18680 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
18690 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
186a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
186b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
186c0 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
186d0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
186e0 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
186f0 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
18700 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
18710 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
18720 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
18730 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
18740 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
18750 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
18760 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
18770 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
18780 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
18790 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
187a0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
187b0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
187c0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
187d0 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
187e0 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
187f0 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
18800 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
18810 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
18820 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
18830 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
18840 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
18850 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
18860 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
18870 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
18880 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
18890 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
188a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
188b0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
188c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
188d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
188e0 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
188f0 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
18900 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
18910 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
18920 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
18930 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
18940 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
18950 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18960 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
18970 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
18980 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
18990 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
189a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
189b0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
189c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
189d0 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
189e0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
189f0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
18a00 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
18a10 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
18a20 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
18a30 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
18a40 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
18a50 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
18a60 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
18a70 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
18a80 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
18a90 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
18aa0 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
18ab0 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
18ac0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
18ad0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
18ae0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
18af0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
18b00 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
18b10 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
18b20 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
18b30 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
18b40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18b50 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
18b60 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   1;.  }.  pList 
18b70 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
18b80 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
18b90 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
18ba0 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
18bb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
18bc0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18bd0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
18be0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
18bf0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
18c00 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
18c10 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
18c20 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
18c30 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
18c40 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
18c50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
18c60 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
18c70 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
18c80 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
18c90 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
18ca0 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
18cb0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
18cc0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
18cd0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
18ce0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
18cf0 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
18d00 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
18d10 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18d20 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
18d30 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
18d40 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
18d50 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
18d60 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
18d70 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
18d80 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
18d90 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
18da0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
18db0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
18dc0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
18dd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18de0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
18df0 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
18e00 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18e10 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
18e20 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
18e30 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
18e40 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
18e50 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
18e60 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
18e70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
18e80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
18e90 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
18ea0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
18eb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
18ec0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
18ed0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
18ee0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
18ef0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
18f00 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
18f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18f20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
18f30 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
18f40 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
18f50 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
18f60 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
18f70 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
18f80 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
18f90 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
18fa0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
18fb0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
18fc0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
18fd0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
18fe0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
18ff0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
19000 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
19010 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
19020 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19030 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
19040 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19050 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
19060 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
19070 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
19080 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
19090 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
190a0 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  , pItem->zIndex)
190b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
190c0 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e  eteTable(pItem->
190d0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
190e0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
190f0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
19100 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
19110 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
19120 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
19130 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
19140 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
19150 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
19160 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19170 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
19180 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19190 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
191a0 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
191b0 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
191c0 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
191d0 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
191e0 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
191f0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
19200 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
19210 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
19220 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
19230 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
19240 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
19250 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
19260 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19270 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
19280 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
19290 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
192a0 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
192b0 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
192c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
192d0 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
192e0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
192f0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
19300 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
19310 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
19320 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
19330 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73  term has a alias
19340 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f  , then pAlias po
19350 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61  ints to the.** a
19360 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20  lias token.  If 
19370 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75  the term is a su
19380 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75  bquery, then pSu
19390 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a  bquery is the.**
193a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
193b0 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75  t that the subqu
193c0 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68  ery encodes.  Th
193d0 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20  e pTable and.** 
193e0 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65  pDatabase parame
193f0 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f  ters are NULL fo
19400 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  r subqueries.  T
19410 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e  he pOn and pUsin
19420 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20  g.** parameters 
19430 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  are the content 
19440 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  of the ON and US
19450 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ING clauses..**.
19460 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  ** Return a new 
19470 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e  SrcList which en
19480 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f  codes is the FRO
19490 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a  M with the new.*
194a0 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f  * term added..*/
194b0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
194c0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
194d0 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  omTerm(.  Parse 
194e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
194f0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
19500 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
19510 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
19520 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61    /* The left pa
19530 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rt of the FROM c
19540 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65  lause already se
19550 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
19560 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
19570 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
19580 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74  able to add to t
19590 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
195a0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
195b0 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e  base,       /* N
195c0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
195d0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ase containing p
195e0 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  Table */.  Token
195f0 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20   *pAlias,       
19600 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
19610 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
19620 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f   AS subexpressio
19630 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
19640 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f  Subquery,      /
19650 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65  * A subquery use
19660 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
19670 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
19680 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20  Expr *pOn,      
19690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
196a0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  N clause of a jo
196b0 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  in */.  IdList *
196c0 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20  pUsing          
196d0 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61  /* The USING cla
196e0 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
196f0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
19700 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19710 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
19720 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
19730 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
19740 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
19750 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
19760 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
19770 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a  | p->nSrc==0 ){.
19780 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
19790 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
197a0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
197b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
197c0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
197d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
197e0 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20   pSubquery);.   
197f0 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20   return p;.  }. 
19800 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
19810 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
19820 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69 61   pAlias && pAlia
19830 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
19840 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
19850 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
19860 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
19870 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
19880 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
19890 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
198a0 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
198b0 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
198c0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
198d0 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
198e0 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
198f0 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
19900 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
19910 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
19920 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
19930 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
19940 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19950 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
19960 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
19970 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
19980 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
19990 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
199a0 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 65  ){.  if( pIndexe
199b0 64 42 79 20 26 26 20 70 20 26 26 20 70 2d 3e 6e  dBy && p && p->n
199c0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 73 74 72  Src>0 ){.    str
199d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
199e0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
199f0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
19a00 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
19a10 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
19a20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
19a30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
19a40 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
19a50 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
19a60 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
19a70 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
19a80 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
19a90 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
19aa0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
19ab0 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
19ac0 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
19ad0 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
19ae0 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
19af0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
19b00 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
19b10 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
19b20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
19b30 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
19b40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
19b50 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
19b60 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
19b70 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
19b80 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
19b90 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
19ba0 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
19bb0 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
19bc0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
19bd0 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
19be0 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
19bf0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
19c00 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
19c10 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
19c20 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
19c30 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
19c40 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
19c50 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
19c60 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
19c70 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
19c80 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
19c90 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
19ca0 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
19cb0 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
19cc0 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
19cd0 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
19ce0 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
19cf0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
19d00 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
19d10 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
19d20 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
19d30 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
19d40 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
19d50 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
19d60 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
19d70 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
19d80 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
19d90 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
19da0 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
19db0 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
19dc0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
19dd0 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
19de0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
19df0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
19e00 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
19e10 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
19e20 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
19e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
19e40 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
19e50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
19e60 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
19e70 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
19e80 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
19e90 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
19ea0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
19eb0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
19ec0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
19ed0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
19ee0 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
19ef0 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
19f00 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
19f10 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
19f20 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
19f30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
19f40 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
19f50 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
19f60 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
19f70 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
19f80 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
19f90 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
19fa0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19fb0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
19fc0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
19fd0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
19fe0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
19ff0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1a000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a010 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
1a020 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
1a030 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
1a040 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
1a050 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1a060 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
1a070 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a080 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1a090 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
1a0a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
1a0b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1a0c0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
1a0d0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
1a0e0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
1a0f0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1a100 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
1a110 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
1a120 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
1a130 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1a140 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1a150 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1a160 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1a170 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1a180 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a190 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1a1a0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1a1b0 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
1a1c0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
1a1d0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1a1e0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1a1f0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1a200 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a210 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1a220 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
1a230 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
1a240 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1a250 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
1a260 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
1a270 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
1a280 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
1a290 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
1a2a0 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
1a2b0 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
1a2c0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1a2d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1a2e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1a2f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a300 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
1a310 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1a320 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1a330 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1a340 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
1a350 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
1a360 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1a370 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1a380 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1a390 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a3a0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1a3b0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
1a3c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1a3d0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1a3e0 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
1a3f0 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
1a400 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
1a410 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1a420 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
1a430 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
1a440 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
1a450 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1a460 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
1a470 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
1a480 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1a490 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1a4a0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
1a4b0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
1a4c0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1a4d0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1a4e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a4f0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1a500 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
1a510 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 5d 20  onst char *az[] 
1a520 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45  = { "BEGIN", "RE
1a530 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43  LEASE", "ROLLBAC
1a540 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  K" };.    assert
1a550 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  ( !SAVEPOINT_BEG
1a560 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  IN && SAVEPOINT_
1a570 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41  RELEASE==1 && SA
1a580 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1a590 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==2 );.#endif.  
1a5a0 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69    if( !v || sqli
1a5b0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1a5c0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45  rse, SQLITE_SAVE
1a5d0 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a  POINT, az[op], z
1a5e0 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
1a5f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a600 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
1a610 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1a620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a630 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a640 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f   OP_Savepoint, o
1a650 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  p, 0, 0, zName, 
1a660 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1a670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1a680 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
1a690 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
1a6a0 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
1a6b0 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
1a6c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1a6d0 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
1a6e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1a6f0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1a700 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1a710 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1a720 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
1a730 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1a740 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1a750 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
1a760 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
1a770 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1a780 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1a790 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1a7a0 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20  int flags = .   
1a7b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1a7c0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20  EN_READWRITE |. 
1a7d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1a7e0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
1a7f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a800 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1a810 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a820 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1a830 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
1a840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1a850 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  _DB;..    rc = s
1a860 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
1a870 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c  ry(db, 0, 0, SQL
1a880 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
1a890 45 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20  E_SIZE, flags,. 
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
1a8d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a8e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a8f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a900 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
1a910 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
1a920 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
1a930 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
1a940 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
1a950 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
1a960 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1a970 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
1a980 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  n 1;.    }.    a
1a990 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1a9a0 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
1a9b0 6e 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75  ns)==0 || db->au
1a9c0 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20  toCommit );.    
1a9d0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1a9e0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
1a9f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f    sqlite3PagerJo
1aa00 75 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65  urnalMode(sqlite
1aa10 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
1aa20 61 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[1].pBt),.   
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 20 20 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c           db->dfl
1aa50 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a 20  tJournalMode);. 
1aa60 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1aa70 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1aa80 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1aa90 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
1aaa0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
1aab0 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
1aac0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
1aad0 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
1aae0 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
1aaf0 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
1ab00 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
1ab10 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
1ab20 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
1ab30 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ab40 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
1ab50 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
1ab60 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
1ab70 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1ab80 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
1ab90 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
1aba0 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
1abb0 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
1abc0 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
1abd0 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
1abe0 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
1abf0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1ac00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1ac10 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
1ac20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
1ac30 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
1ac40 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
1ac50 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
1ac60 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
1ac70 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
1ac80 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
1ac90 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
1aca0 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
1acb0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1acc0 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
1acd0 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
1ace0 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
1acf0 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
1ad00 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
1ad10 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
1ad20 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
1ad30 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
1ad40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
1ad50 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
1ad60 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
1ad70 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
1ad80 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
1ad90 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
1ada0 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
1adb0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
1adc0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1add0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
1ade0 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
1adf0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
1ae00 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
1ae10 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
1ae20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
1ae30 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
1ae40 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
1ae50 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
1ae60 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
1ae70 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
1ae80 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
1ae90 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
1aea0 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
1aeb0 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
1aec0 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
1aed0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
1aee0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
1aef0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
1af00 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1af10 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
1af20 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
1af30 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
1af40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1af50 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1af60 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
1af70 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
1af80 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
1af90 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
1afa0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
1afb0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
1afc0 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
1afd0 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
1afe0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
1aff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b000 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
1b010 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
1b020 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
1b030 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
1b040 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b050 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
1b060 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
1b070 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
1b080 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  <SQLITE_MAX_ATTA
1b090 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61  CHED+2 );.    ma
1b0a0 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20  sk = 1<<iDb;.   
1b0b0 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f   if( (pParse->co
1b0c0 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  okieMask & mask)
1b0d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
1b0e0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1b0f0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1b100 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1b110 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
1b120 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
1b130 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
1b140 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
1b150 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1b160 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b170 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
1b180 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  se(pParse);.    
1b190 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1b1a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b1b0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
1b1c0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
1b1d0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
1b1e0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1b1f0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
1b200 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b210 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
1b220 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
1b230 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
1b240 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
1b250 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1b260 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
1b270 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1b280 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
1b290 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
1b2a0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
1b2b0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
1b2c0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
1b2d0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
1b2e0 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
1b2f0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
1b300 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
1b310 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
1b320 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
1b330 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
1b340 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
1b350 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
1b360 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1b370 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
1b380 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
1b390 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
1b3a0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
1b3b0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
1b3c0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
1b3d0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
1b3e0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
1b3f0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
1b400 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
1b410 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
1b420 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
1b430 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
1b440 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
1b450 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1b460 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1b470 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1b480 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1b490 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
1b4a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b4b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1b4c0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
1b4d0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1b4e0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1b4f0 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65  , iDb);.  pParse
1b500 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31  ->writeMask |= 1
1b510 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74  <<iDb;.  if( set
1b520 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61  Statement && pPa
1b530 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
1b540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b550 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74  eAddOp1(v, OP_St
1b560 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20  atement, iDb);. 
1b570 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
1b580 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
1b590 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
1b5a0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1b5b0 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
1b5c0 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
1b5d0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
1b5e0 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
1b5f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b600 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1b610 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
1b620 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1b630 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
1b640 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
1b650 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
1b660 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
1b670 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
1b680 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
1b690 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69  azColl[i];.    i
1b6a0 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28  f( z==zColl || (
1b6b0 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d  z && zColl && 0=
1b6c0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1b6d0 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20  z, zColl)) ){.  
1b6e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b6f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b700 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1b710 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1b720 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1b730 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1b740 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1b750 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1b760 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1b770 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1b780 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1b790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b7a0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1b7b0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1b7c0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1b7d0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1b7e0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1b7f0 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1b800 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1b810 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1b820 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1b830 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1b840 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1b850 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1b860 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1b870 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1b880 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1b890 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1b8a0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1b8b0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1b8c0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1b8d0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1b8e0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1b8f0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1b900 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1b910 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1b920 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1b930 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1b940 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1b950 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1b960 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1b970 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1b980 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1b990 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1b9a0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1b9b0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1b9c0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1b9d0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1b9e0 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1b9f0 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1ba00 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1ba10 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1ba20 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1ba30 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1ba40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1ba50 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1ba60 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1ba90 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1baa0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1bab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1bac0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1bad0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1bae0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1baf0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1bb00 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1bb10 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1bb20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bb30 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1bb40 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1bb50 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1bb60 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1bb70 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1bb80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1bb90 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
1bba0 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
1bbb0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
1bbc0 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
1bbd0 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
1bbe0 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
1bbf0 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
1bc00 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
1bc10 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
1bc20 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
1bc30 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
1bc40 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1bc50 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
1bc60 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1bc70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
1bc80 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
1bc90 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1bca0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
1bcb0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
1bcc0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1bcd0 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1bcf0 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
1bd00 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
1bd10 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
1bd20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
1bd30 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
1bd40 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
1bd50 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
1bd60 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1bd70 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
1bd80 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
1bd90 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
1bda0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
1bdb0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
1bdc0 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
1bdd0 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
1bde0 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
1bdf0 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
1be00 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
1be10 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
1be20 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
1be30 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
1be40 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
1be50 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
1be60 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
1be70 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
1be80 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
1be90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1bea0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
1beb0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
1bec0 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1bed0 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
1bee0 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
1bef0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
1bf00 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
1bf10 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
1bf20 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
1bf30 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
1bf40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bf50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1bf60 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
1bf70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1bf80 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
1bf90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1bfa0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
1bfb0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1bfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1bfd0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1bfe0 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
1bff0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1c000 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1c010 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1c020 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
1c030 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1c040 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c050 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
1c060 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
1c070 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c080 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
1c090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c0a0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
1c0b0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
1c0c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1c0d0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1c0e0 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1c0f0 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
1c100 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1c110 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
1c120 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
1c130 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1c140 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
1c150 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
1c160 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
1c170 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1c180 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1c190 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
1c1a0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
1c1b0 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61  pName1==0 || pNa
1c1c0 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me1->z==0 ){.   
1c1d0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1c1e0 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
1c1f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
1c200 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20  e if( pName2==0 
1c210 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
1c220 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
1c230 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
1c240 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
1c250 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
1c260 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1c270 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
1c280 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
1c290 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
1c2a0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
1c2b0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
1c2c0 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 2d  NC(db), zColl, -
1c2d0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1c2e0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Coll ){.      if
1c2f0 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( zColl ){.     
1c300 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1c310 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
1c320 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1c330 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1c340 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oll);.      }.  
1c350 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1c360 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
1c370 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
1c380 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1c390 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
1c3a0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
1c3b0 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
1c3c0 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
1c3d0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
1c3e0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1c3f0 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
1c400 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
1c410 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
1c420 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1c430 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
1c440 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1c450 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
1c460 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
1c470 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
1c480 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
1c490 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1c4a0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
1c4b0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1c4c0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1c4d0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
1c4e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c4f0 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
1c500 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
1c510 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1c520 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1c530 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1c540 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
1c550 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
1c560 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c570 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
1c580 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1c590 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
1c5a0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
1c5b0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
1c5c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1c5d0 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c  eturn a dynamicl
1c5e0 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49  y allocated KeyI
1c5f0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
1c600 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
1c610 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65  * with OP_OpenRe
1c620 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69  ad or OP_OpenWri
1c630 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  te to access dat
1c640 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78  abase index pIdx
1c650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1c660 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72  ssful, a pointer
1c670 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75   to the new stru
1c680 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
1c690 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  d. In this case.
1c6a0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
1c6b0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1c6c0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
1c6d0 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20  DbFree(db, ) on 
1c6e0 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a  the returned .**
1c6f0 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20   pointer. If an 
1c700 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75  error occurs (ou
1c710 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d  t of memory or m
1c720 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  issing collation
1c730 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20   .** sequence), 
1c740 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1c750 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f   and the state o
1c760 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64  f pParse updated
1c770 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74   to reflect.** t
1c780 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79  he error..*/.Key
1c790 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64  Info *sqlite3Ind
1c7a0 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20  exKeyinfo(Parse 
1c7b0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
1c7c0 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
1c7d0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
1c7e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
1c7f0 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f  t nBytes = sizeo
1c800 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43  f(KeyInfo) + (nC
1c810 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c  ol-1)*sizeof(Col
1c820 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20  lSeq*) + nCol;. 
1c830 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c840 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
1c850 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65  Info *pKey = (Ke
1c860 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44  yInfo *)sqlite3D
1c870 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1c880 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20  nBytes);..  if( 
1c890 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79  pKey ){.    pKey
1c8a0 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64  ->db = pParse->d
1c8b0 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  b;.    pKey->aSo
1c8c0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
1c8d0 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43  &(pKey->aColl[nC
1c8e0 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ol]);.    assert
1c8f0 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72  ( &pKey->aSortOr
1c900 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75  der[nCol]==&(((u
1c910 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73  8 *)pKey)[nBytes
1c920 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ]) );.    for(i=
1c930 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
1c940 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
1c950 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
1c960 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  l[i];.      asse
1c970 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20  rt( zColl );.   
1c980 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
1c990 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  ] = sqlite3Locat
1c9a0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1c9b0 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20   zColl, -1);.   
1c9c0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
1c9d0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
1c9e0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
1c9f0 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46    }.    pKey->nF
1ca00 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c  ield = (u16)nCol
1ca10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1ca20 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1ca30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ca40 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b  b, pKey);.    pK
1ca50 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1ca60 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a           turn pKey;.}.