/ Hex Artifact Content
Login

Artifact 741240c8d6a54201fa8757db1ee6efba71be59a2:


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 32 31 20 32 30 30 39 2f 30 32 2f 32 38  1.521 2009/02/28
02f0: 20 31 30 3a 34 37 3a 34 32 20 64 61 6e 69 65 6c   10:47:42 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 33 28  lite3VdbeAddOp3(
4810: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4820: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
4830: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
4840: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4850: 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50  -1, (char *)5, P
4860: 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20  4_INT32);  /* 5 
4870: 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a  column table */.
4880: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
4890: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
48a0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
48b0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
48c0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
48d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
48e0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
48f0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
4900: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
4910: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
4920: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4930: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
4940: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4950: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4960: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4970: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4980: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
4990: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
49a0: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
49b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
49c0: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
49d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
49e0: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
49f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
4a00: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4a10: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4a20: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
4a30: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4a40: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
4a50: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4a60: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4a70: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4a80: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4a90: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4aa0: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4ab0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
4ac0: 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  30(pDb->zName) &
4ad0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4ae0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4af0: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
4b00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
4b10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4b20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
4b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
4b40: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4b50: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
4b60: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
4b70: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
4b80: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
4b90: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4ba0: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4bb0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4bc0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4bd0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4be0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4bf0: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4c00: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4c10: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4c20: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4c30: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4c40: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4c80: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
4c90: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cb0: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4cc0: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
4cd0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4ce0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4cf0: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
4d00: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
4d10: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
4d20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4d30: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
4d40: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4d50: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4d60: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4d70: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4d80: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
4d90: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
4da0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
4db0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
4dc0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
4dd0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4de0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
4df0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
4e00: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4e10: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
4e20: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
4e30: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
4e40: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
4e50: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4e60: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4e70: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
4e80: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
4e90: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
4ea0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4eb0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
4ec0: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
4ed0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4ee0: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
4ef0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
4f00: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
4f10: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
4f20: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
4f30: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
4f40: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4f50: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
4f60: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
4f70: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
4f80: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
4f90: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
4fa0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
4fb0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
4fc0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
4fd0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4fe0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
4ff0: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5000: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5010: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5020: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
5030: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
5040: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5050: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
5060: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
5070: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
5080: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
5090: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
50a0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
50b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
50c0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
50d0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
50e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
50f0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5100: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
5110: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
5120: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
5130: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5140: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5150: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
5160: 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  se");.      pPar
5170: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5180: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5190: 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20   }.    *pUnqual 
51a0: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
51b0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
51c0: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
51d0: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
51e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
51f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
5200: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
5210: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
5220: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5230: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5240: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
5250: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5260: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
5270: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
5280: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
5290: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
52a0: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
52b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
52c0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
52d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
52e0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
52f0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
5300: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
5310: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
5320: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
5330: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
5340: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
5350: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
5360: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
5370: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
5380: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
5390: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
53a0: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
53b0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
53c0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
53d0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
53e0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
53f0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5400: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
5410: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
5420: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
5430: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
5440: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
5450: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
5460: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
5470: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
5480: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
5490: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
54a0: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
54b0: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
54c0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
54d0: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
54e0: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
54f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5500: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
5510: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
5520: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
5530: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
5540: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5550: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
5560: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
5580: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
5590: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
55a0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
55b0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
55c0: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
55d0: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
55e0: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
55f0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
5600: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
5610: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5620: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
5630: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5640: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
5650: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
5660: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
5670: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
5680: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
5690: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
56a0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
56b0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
56c0: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
56d0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
56e0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
56f0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
5700: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
5710: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
5720: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
5730: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
5740: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
5750: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
5760: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
5770: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
5780: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
5790: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
57a0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
57b0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
57c0: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
57d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
57e0: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
57f0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
5800: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
5810: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
5820: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
5830: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
5840: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
5850: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
5860: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5870: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
5880: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
5890: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
58a0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
58b0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
58c0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
58d0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
58e0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
58f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5900: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5910: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5920: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
5930: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
5940: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5950: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
5960: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
5970: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
5980: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5990: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
59a0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
59b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
59c0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
59d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
59e0: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
59f0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
5a00: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
5a10: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
5a20: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
5a30: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
5a40: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
5a50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
5a60: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
5a70: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
5a80: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
5a90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5aa0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
5ab0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5ac0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5ad0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5ae0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5af0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
5b00: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5b10: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
5b20: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
5b30: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
5b40: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
5b50: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
5b60: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
5b70: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
5b80: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
5b90: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
5bb0: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
5bc0: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5bd0: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
5be0: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
5bf0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
5c00: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
5c10: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5c20: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
5c30: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5c40: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5c50: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5c60: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5c70: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
5c80: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5c90: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5ca0: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
5cb0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5cc0: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
5cd0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5ce0: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5cf0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5d00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5d10: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
5d20: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
5d30: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5d40: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5d50: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
5d60: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5d70: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5d80: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
5d90: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
5da0: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
5db0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
5dc0: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
5dd0: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
5de0: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
5df0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
5e00: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5e10: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
5e20: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
5e30: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
5e40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5e50: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5e60: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
5e70: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
5e80: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
5e90: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
5ea0: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
5eb0: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
5ec0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5ed0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
5ee0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
5ef0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
5f00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5f10: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5f20: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
5f30: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5f40: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5f50: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5f60: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5f70: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5f80: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5f90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5fa0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5fb0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5fc0: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5fd0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5fe0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5ff0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
6000: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
6010: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
6020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6030: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
6040: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
6050: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
6060: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
6070: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
6080: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
6090: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
60a0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
60b0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
60c0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
60d0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
60e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
60f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6100: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
6110: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
6120: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6130: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6140: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6150: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6160: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
6170: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6180: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6190: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
61a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
61b0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
61c0: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
61d0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
61e0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
61f0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
6200: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6210: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6220: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
6230: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6240: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6250: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6260: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6270: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6280: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6290: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
62a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
62b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
62c0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
62d0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
62e0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
62f0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
6300: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6310: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6320: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6330: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6340: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6350: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6360: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6370: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6380: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6390: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
63a0: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
63b0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
63c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
63d0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
63e0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
63f0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6400: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6410: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6420: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6430: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6440: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
6450: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6460: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6470: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6480: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6490: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
64a0: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
64b0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
64c0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
64d0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  me);.    if( pTa
64e0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
64f0: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
6500: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6510: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
6520: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
6530: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
6540: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
6550: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6560: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6570: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
6580: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
6590: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
65a0: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
65b0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
65c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
65d0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
65e0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
65f0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
6600: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6610: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6620: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
6630: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
6640: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6650: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
6660: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
6670: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
6680: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
6690: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
66a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
66b0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
66c0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
66d0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
66e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
66f0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
6700: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
6710: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
6720: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
6730: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
6740: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
6750: 6c 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69  le->db = db;.  i
6760: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
6770: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65  able ) sqlite3De
6780: 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  leteTable(pParse
6790: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20  ->pNewTable);.  
67a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
67b0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
67c0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
67d0: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
67e0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
67f0: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
6800: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
6810: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
6820: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
6830: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6840: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
6850: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
6860: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
6870: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
6880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6890: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
68a0: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
68b0: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
68c0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
68d0: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
68e0: 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  {.    pTable->pS
68f0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
6900: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
6910: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
6920: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
6930: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
6940: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
6950: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
6960: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
6970: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
6980: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
6990: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
69a0: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
69b0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
69c0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
69d0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
69e0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
69f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
6a00: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
6a10: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
6a20: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
6a30: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
6a40: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
6a50: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
6a60: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
6a70: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
6a80: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
6a90: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
6aa0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
6ab0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
6ac0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
6ad0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
6ae0: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
6af0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
6b00: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
6b10: 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69     int j1;.    i
6b20: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
6b30: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
6b40: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c  2, reg3;.    sql
6b50: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6b60: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
6b70: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
6b80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6b90: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
6ba0: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
6bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6bc0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
6bd0: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  egin);.    }.#en
6be0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
6bf0: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61  he file format a
6c00: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74  nd encoding in t
6c10: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65  he database have
6c20: 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a   not been set, .
6c30: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20      ** set them 
6c40: 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  now..    */.    
6c50: 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg1 = pParse->r
6c60: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
6c70: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6c80: 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g2 = pParse->reg
6c90: 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Root = ++pParse-
6ca0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20  >nMem;.    reg3 
6cb0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6cc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cd0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65  eAddOp3(v, OP_Re
6ce0: 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72  adCookie, iDb, r
6cf0: 65 67 33 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69  eg3, 1);   /* fi
6d00: 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20  le_format */.   
6d10: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
6d20: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
6d30: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
6d40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6d50: 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66  If, reg3);.    f
6d60: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
6d70: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
6d80: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
6d90: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
6da0: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
6db0: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
6dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6dd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6de0: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
6df0: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
6e00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6e10: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6e20: 20 69 44 62 2c 20 31 2c 20 72 65 67 33 29 3b 0a   iDb, 1, reg3);.
6e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6e40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6e50: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
6e60: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
6e70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6e80: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
6e90: 20 34 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   4, reg3);.    s
6ea0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6eb0: 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
6ec0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
6ed0: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
6ee0: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
6ef0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6f00: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
6f10: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
6f20: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
6f30: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
6f40: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
6f50: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
6f60: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
6f70: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
6f80: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
6f90: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
6fa0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
6fb0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
6fc0: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74  is left on the t
6fd0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
6fe0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6ff0: 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65  d value is neede
7000: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
7010: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7020: 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67  le will.    ** g
7030: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
7040: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7050: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
7060: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7070: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7080: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
7090: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
70a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
70b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
70c0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
70d0: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
70e0: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
70f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7100: 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
7110: 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32  Table, iDb, reg2
7120: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7130: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
7140: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ble(pParse, iDb)
7150: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7160: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7170: 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29  wRowid, 0, reg1)
7180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7190: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
71a0: 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20  ll, 0, reg3);.  
71b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
71c0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
71d0: 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29  , 0, reg3, reg1)
71e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
71f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
7200: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
7210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7220: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
7230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
7240: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
7250: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
7260: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
7270: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
7280: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
7290: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
72a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
72b0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
72c0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
72d0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
72e0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f  d to compare two
72f0: 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61   strings in a ca
7300: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
7310: 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20  anner..** It is 
7320: 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
7330: 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c  than calling sql
7340: 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69  ite3StrICmp() di
7350: 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70  rectly, but.** p
7360: 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63  roduces larger c
7370: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  ode..**.** WARNI
7380: 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  NG: This macro i
7390: 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65  s not compatible
73a0: 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70   with the strcmp
73b0: 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a  () family. It.**
73c0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
73d0: 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73   the two strings
73e0: 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65   are equal, othe
73f0: 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  rwise false..*/.
7400: 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28  #define STRICMP(
7410: 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33  x, y) (\.sqlite3
7420: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7430: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7440: 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65  x)]==   \.sqlite
7450: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
7460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
7470: 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71  (y)]     \.&& sq
7480: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29  lite3StrICmp((x)
7490: 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a  +1,(y)+1)==0 )..
74a0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
74b0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
74c0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
74d0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
74e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
74f0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
7500: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
7510: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
7520: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
7530: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
7540: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
7550: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
7560: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
7570: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
7580: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
7590: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
75a0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
75b0: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
75c0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
75d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
75e0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
75f0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
7600: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43  ;.  char *z;.  C
7610: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
7620: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7630: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  rse->db;.  if( (
7640: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7650: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7660: 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  rn;.#if SQLITE_M
7670: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
7680: 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c  p->nCol+1>db->aL
7690: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
76a0: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
76b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
76c0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
76d0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73  ny columns on %s
76e0: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
76f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
7700: 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74  ndif.  z = sqlit
7710: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
7720: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
7730: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
7740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7750: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
7760: 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20   if( STRICMP(z, 
7770: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
7780: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7790: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
77a0: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
77b0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
77c0: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
77d0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
77e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
77f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
7800: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
7810: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
7820: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
7830: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
7840: 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d  c(db,p->aCol,(p-
7850: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
7860: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7870: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
7880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
7890: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
78a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
78b0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
78c0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
78d0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
78e0: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
78f0: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
7900: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
7910: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
7920: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
7930: 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66  s no type specif
7940: 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76  ied, columns hav
7950: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66  e the default af
7960: 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e  finity.  ** 'NON
7970: 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  E'. If there is 
7980: 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  a type specified
7990: 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64  , then sqlite3Ad
79a0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69  dColumnType() wi
79b0: 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  ll.  ** be calle
79c0: 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43  d next to set pC
79d0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72  ol->affinity cor
79e0: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70  rectly..  */.  p
79f0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
7a00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
7a10: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
7a20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
7a30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
7a40: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
7a50: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
7a60: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
7a70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7a80: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
7a90: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
7aa0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
7ab0: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
7ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
7ad0: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
7ae0: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
7af0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
7b00: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
7b10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7b20: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
7b30: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
7b40: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
7b50: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
7b60: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7b70: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7b80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
7b90: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
7ba0: 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69  i>=0 ) p->aCol[i
7bb0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ].notNull = (u8)
7bc0: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
7bd0: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
7be0: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
7bf0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
7c00: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
7c10: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
7c20: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
7c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7c40: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
7c50: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
7c60: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
7c70: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
7c80: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
7c90: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
7ca0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
7cb0: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
7cc0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
7cd0: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
7ce0: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
7cf0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
7d00: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
7d10: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
7d20: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
7d30: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
7d40: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
7d50: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
7d60: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
7d70: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
7d80: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
7d90: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
7da0: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
7db0: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
7dc0: 2d 2d 2d 2d 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 0a 2a 2a 20  ------------.** 
7de0: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
7df0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
7e00: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
7e10: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7e20: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
7e30: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7e40: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
7e50: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
7e60: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7e70: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
7e80: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
7e90: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
7ea0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
7eb0: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
7ec0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7ed0: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
7ee0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7ef0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
7f00: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
7f10: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
7f20: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
7f30: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
7f40: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
7f50: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
7f60: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
7f70: 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e  Type(const Token
7f80: 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20   *pType){.  u32 
7f90: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
7fa0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
7fb0: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
7fc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7fd0: 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20  In = pType->z;. 
7fe0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7ff0: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54  char *zEnd = &pT
8000: 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d  ype->z[pType->n]
8010: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21  ;..  while( zIn!
8020: 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d  =zEnd ){.    h =
8030: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
8040: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a  3UpperToLower[*z
8050: 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  In];.    zIn++;.
8060: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
8070: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
8080: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
80a0: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
80b0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
80c0: 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20  EXT; .    }else 
80d0: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
80e0: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
80f0: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
8100: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
8110: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8120: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
8130: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
8140: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
8150: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
8160: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
8170: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
8180: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
8190: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
81a0: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
81b0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
81c0: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
81d0: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
81e0: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
81f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
8200: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
8210: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
8220: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
8230: 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ONE;.#ifndef SQL
8240: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
8250: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73  G_POINT.    }els
8260: 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c  e if( h==(('r'<<
8270: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
8280: 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20  a'<<8)+'l')     
8290: 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a       /* REAL */.
82a0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
82b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
82c0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
82d0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
82e0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
82f0: 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28   h==(('f'<<24)+(
8300: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
8310: 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20  )+'a')          
8320: 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20  /* FLOA */.     
8330: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8340: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
8350: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8360: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
8370: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8380: 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c  ('d'<<24)+('o'<<
8390: 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27  16)+('u'<<8)+'b'
83a0: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f  )          /* DO
83b0: 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  UB */.        &&
83c0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
83d0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
83e0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
83f0: 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a  FF_REAL;.#endif.
8400: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68      }else if( (h
8410: 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28  &0x00FFFFFF)==((
8420: 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38  'i'<<16)+('n'<<8
8430: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20  )+'t') ){    /* 
8440: 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  INT */.      aff
8450: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
8460: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
8470: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
8480: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
8490: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
84a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
84b0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
84c0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
84d0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
84e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
84f0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
8500: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
8510: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
8520: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
8530: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
8540: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
8550: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
8560: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8570: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
8580: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
8590: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
85a0: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
85b0: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
85c0: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
85d0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
85e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
85f0: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
8600: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
8610: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
8620: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
8630: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
8640: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
8650: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  rse, Token *pTyp
8660: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8670: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
8680: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8690: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
86a0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
86b0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
86c0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
86d0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
86e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
86f0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
8700: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
8710: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
8720: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70  e(db, pCol->zTyp
8730: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  e);.  pCol->zTyp
8740: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
8750: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 79  romToken(db, pTy
8760: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
8770: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
8780: 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70  ffinityType(pTyp
8790: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
87a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
87b0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
87c0: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
87d0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
87e0: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
87f0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
8800: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8810: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
8820: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
8830: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
8840: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
8850: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
8860: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
8870: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
8880: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8890: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
88a0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
88b0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
88c0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
88d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
88e0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
88f0: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
8900: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
8910: 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Expr){.  Table *
8920: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
8930: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8940: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8950: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
8960: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20  ->pNewTable)!=0 
8970: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
8980: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
8990: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
89a0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
89b0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45  antOrFunction(pE
89c0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
89d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
89e0: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
89f0: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
8a00: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
8a10: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
8a20: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
8a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
8a40: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70  * A copy of pExp
8a50: 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  r is used instea
8a60: 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d of the origina
8a70: 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74  l, as pExpr cont
8a80: 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ains.      ** to
8a90: 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20  kens that point 
8aa0: 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f  to volatile memo
8ab0: 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f  ry. The 'span' o
8ac0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8ad0: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
8ae0: 75 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20  uired by pragma 
8af0: 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20  table_info..    
8b00: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
8b10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8b20: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
8b30: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
8b40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8b50: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 45 58 50  p(db, pExpr, EXP
8b60: 52 44 55 50 5f 52 45 44 55 43 45 7c 45 58 50 52  RDUP_REDUCE|EXPR
8b70: 44 55 50 5f 53 50 41 4e 29 3b 0a 20 20 20 20 7d  DUP_SPAN);.    }
8b80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
8b90: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
8ba0: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pr);.}../*.** De
8bb0: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
8bc0: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
8bd0: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
8be0: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
8bf0: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
8c00: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
8c10: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
8c20: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
8c30: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
8c40: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8c50: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
8c60: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
8c70: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
8c80: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
8c90: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
8ca0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
8cb0: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
8cc0: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
8cd0: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
8ce0: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
8cf0: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
8d00: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
8d10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
8d20: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
8d30: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
8d40: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
8d50: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
8d60: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
8d70: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
8d80: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
8d90: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
8da0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
8db0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
8dc0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
8dd0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
8de0: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
8df0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
8e00: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
8e10: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
8e20: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
8e30: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8e40: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
8e50: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
8e60: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8e70: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
8e80: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
8e90: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
8ea0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
8eb0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
8ec0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
8ed0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
8ee0: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
8ef0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
8f00: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8f10: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
8f20: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
8f30: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
8f40: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
8f50: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
8f60: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
8f70: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
8f80: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
8f90: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
8fa0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8fb0: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
8fc0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
8fd0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
8fe0: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
8ff0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
9000: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
9010: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
9020: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
9030: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
9040: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
9050: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
9060: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
9070: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
9080: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
9090: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
90a0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
90b0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
90c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
90d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
90e0: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
90f0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
9100: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
9110: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
9120: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
9130: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
9140: 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  }.  pTab->tabFla
9150: 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d  gs |= TF_HasPrim
9160: 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c  aryKey;.  if( pL
9170: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
9180: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
9190: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
91a0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
91b0: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
91c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
91d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
91e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
91f0: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
9200: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
9210: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
9220: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
9230: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
9240: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9250: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9280: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
9290: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
92a0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
92b0: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
92c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
92d0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
92e0: 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c  ->nExpr>1 ) iCol
92f0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28   = -1;.  }.  if(
9300: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
9310: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
9320: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
9330: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
9340: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79  e;.  }.  if( zTy
9350: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
9360: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
9370: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
9380: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d    && sortOrder==
9390: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b  SQLITE_SO_ASC ){
93a0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
93b0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
93c0: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38  b->keyConf = (u8
93d0: 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73  )onError;.    as
93e0: 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30  sert( autoInc==0
93f0: 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29   || autoInc==1 )
9400: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
9410: 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a  lags |= autoInc*
9420: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
9430: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
9440: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
9450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9460: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
9470: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9480: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
9490: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
94a0: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
94b0: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
94c0: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
94d0: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
94e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
94f0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
9500: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
9510: 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f  ror, 0, 0, sortO
9520: 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c  rder, 0);.    pL
9530: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
9540: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
9550: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9560: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
9570: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
9580: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
9590: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
95a0: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
95b0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
95c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
95d0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
95e0: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
95f0: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
9600: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
9610: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9620: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
9630: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
9640: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
9650: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
9660: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9680: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
9690: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
96a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
96b0: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
96c0: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
96d0: 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20     /* The CHECK 
96e0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
96f0: 62 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f  be duplicated so
9700: 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66   that tokens ref
9710: 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c  er.    ** to mal
9720: 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20  loced space and 
9730: 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72  not the (ephemer
9740: 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20  al) text of the 
9750: 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20  CREATE TABLE.   
9760: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f   ** statement */
9770: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
9780: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  k = sqlite3ExprA
9790: 6e 64 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68  nd(db, pTab->pCh
97a0: 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  eck, .          
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 73 71 6c 69 74 65 33 45          sqlite3E
97d0: 78 70 72 44 75 70 28 64 62 2c 20 70 43 68 65 63  xprDup(db, pChec
97e0: 6b 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 7d 0a  kExpr, 0));.  }.
97f0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
9800: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9810: 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f  CheckExpr);.}../
9820: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
9830: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
9840: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9850: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
9860: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
9870: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
9880: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9890: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
98a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
98b0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
98c0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
98d0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
98e0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
98f0: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
9900: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
9910: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
9920: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
9930: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
9940: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
9950: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
9960: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
9970: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
9980: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
9990: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
99a0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
99b0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
99c0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
99d0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
99e0: 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  zColl, -1) ){.  
99f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
9a00: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43     p->aCol[i].zC
9a10: 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a  oll = zColl;.  .
9a20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
9a30: 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64  lumn is declared
9a40: 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d   as "<name> PRIM
9a50: 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20  ARY KEY COLLATE 
9a60: 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20  <type>",.    ** 
9a70: 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61  then an index ma
9a80: 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61  y have been crea
9a90: 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75  ted on this colu
9aa0: 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  mn before the.  
9ab0: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
9ac0: 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43  ype was added. C
9ad0: 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69  orrect this if i
9ae0: 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  t is the case.. 
9af0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49     */.    for(pI
9b00: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
9b10: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9b20: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
9b30: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
9b40: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
9b50: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
9b60: 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20  n[0]==i ){.     
9b70: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
9b80: 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  0] = p->aCol[i].
9b90: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  zColl;.      }. 
9ba0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9bb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9bc0: 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
9bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
9be0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9bf0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
9c00: 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61  uence for databa
9c10: 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a  se native text.*
9c20: 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74  * encoding ident
9c30: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72  ified by the str
9c40: 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74  ing zName, lengt
9c50: 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  h nName..**.** I
9c60: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
9c70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9c80: 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ce is not availa
9c90: 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69  ble, or not avai
9ca0: 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20  lable.** in the 
9cb0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
9cc0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f  encoding, the co
9cd0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9ce0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a  is invoked to.**
9cf0: 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20   request it. If 
9d00: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9d10: 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73  ctory does not s
9d20: 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71  upply such a seq
9d30: 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68  uence,.** and th
9d40: 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76  e sequence is av
9d50: 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  ailable in anoth
9d60: 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  er text encoding
9d70: 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a  , then that is.*
9d80: 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  * returned inste
9d90: 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  ad..**.** If no 
9da0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9db0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
9dc0: 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72  ions sequence ar
9dd0: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a  e available, or.
9de0: 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72  ** another error
9df0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
9e00: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
9e10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
9e20: 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70  ritten into.** p
9e30: 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Parse..**.** Thi
9e40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77  s routine is a w
9e50: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
9e60: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
9e70: 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
9e80: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65  e.** invokes the
9e90: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9ea0: 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ry if the named 
9eb0: 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  collation cannot
9ec0: 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64   be found.** and
9ed0: 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72   generates an er
9ee0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
9ef0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
9f00: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
9f10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
9f20: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
9f30: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71  int nName){.  sq
9f40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9f50: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
9f60: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
9f70: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
9f80: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
9f90: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
9fa0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
9fb0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
9fc0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
9fd0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
9fe0: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
9ff0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
a000: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
a010: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
a020: 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43  etCollSeq(db, pC
a030: 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  oll, zName, nNam
a040: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  e);.    if( !pCo
a050: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
a060: 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20  nName<0 ){.     
a070: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74     nName = sqlit
a080: 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61  e3Strlen(db, zNa
a090: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
a0a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a0b0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
a0c0: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
a0d0: 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e  quence: %.*s", n
a0e0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
a0f0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
a100: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
a110: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a  rn pColl;.}.../*
a120: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a130: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72  e that will incr
a140: 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61  ement the schema
a150: 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54   cookie..**.** T
a160: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
a170: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
a180: 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73  rmine when the s
a190: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a  chema for the.**
a1a0: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
a1b0: 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73  s.  After each s
a1c0: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68  chema change, th
a1d0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a  e cookie value.*
a1e0: 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e  * changes.  When
a1f0: 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74   a process first
a200: 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d   reads the schem
a210: 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65  a it records the
a220: 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65  .** cookie.  The
a230: 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65  reafter, wheneve
a240: 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63  r it goes to acc
a250: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
a260: 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74  ,.** it checks t
a270: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b  he cookie to mak
a280: 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d  e sure the schem
a290: 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65  a has not change
a2a0: 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61  d.** since it wa
a2b0: 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a  s last read..**.
a2c0: 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20  ** This plan is 
a2d0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62  not completely b
a2e0: 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74  ullet-proof.  It
a2f0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
a300: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74  .** the schema t
a310: 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c  o change multipl
a320: 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20  e times and for 
a330: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65  the cookie to be
a340: 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20  .** set back to 
a350: 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75  prior value.  Bu
a360: 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  t schema changes
a370: 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a   are infrequent.
a380: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61  ** and the proba
a390: 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e  bility of hittin
a3a0: 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69  g the same cooki
a3b0: 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  e value is only.
a3c0: 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32  ** 1 chance in 2
a3d0: 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73  ^32.  So we're s
a3e0: 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76  afe enough..*/.v
a3f0: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
a400: 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70  eCookie(Parse *p
a410: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
a420: 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
a430: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a440: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
a450: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a460: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
a470: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a490: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
a4a0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
a4b0: 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
a4c0: 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73  okie+1, r1);.  s
a4d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a4e0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
a4f0: 2c 20 69 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20  , iDb, 0, r1);. 
a500: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a510: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a520: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
a530: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
a540: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
a550: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
a560: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
a570: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
a580: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
a590: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
a5a0: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
a5b0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
a5c0: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
a5d0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
a5e0: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
a5f0: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
a600: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
a610: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
a620: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
a630: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
a640: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
a650: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
a660: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
a670: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
a680: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
a690: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
a6a0: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  + 2;.}../*.** Wr
a6b0: 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65  ite an identifie
a6c0: 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  r onto the end o
a6d0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
a6e0: 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74  ng.  Add.** quot
a6f0: 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20  e characters as 
a700: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
a710: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
a720: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
a730: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
a740: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
a750: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
a760: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
a770: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
a780: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
a790: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
a7a0: 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  Idx;.  for(j=0; 
a7b0: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
a7c0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
a7d0: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
a7e0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
a7f0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
a800: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
a810: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
a820: 7c 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  | sqlite3Isdigit
a830: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
a850: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
a860: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
a870: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
a880: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a890: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
a8a0: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
a8b0: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
a8c0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
a8d0: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
a8e0: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
a8f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
a900: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a910: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
a920: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
a930: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a940: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a950: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
a960: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
a970: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
a980: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
a990: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
a9a0: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
a9b0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
a9c0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
a9d0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
a9e0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
a9f0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
aa00: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
aa10: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
aa20: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
aa30: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
aa40: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
aa50: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
aa60: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
aa70: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
aa80: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
aa90: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
aaa0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
aab0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
aac0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
aad0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
aae0: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
aaf0: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
ab00: 20 20 20 20 20 6e 20 2b 3d 20 28 73 71 6c 69 74       n += (sqlit
ab10: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20  e3Strlen30(z) + 
ab20: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
ab30: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
ab40: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
ab50: 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<50 ){.    zS
ab60: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
ab70: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
ab80: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
ab90: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
aba0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
abb0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
abc0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
abd0: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
abe0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
abf0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
ac00: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
ac10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
ac20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
ac30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
ac40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
ac50: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
ac60: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
ac70: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
ac80: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
ac90: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
aca0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
acb0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
acc0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
acd0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
ace0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
acf0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  Col++){.    sqli
ad00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
ad10: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  , &zStmt[k], zSe
ad20: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c  p);.    k += sql
ad30: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53  ite3Strlen30(&zS
ad40: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
ad50: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
ad60: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
ad70: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
ad80: 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43  .    if( (z = pC
ad90: 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b  ol->zType)!=0 ){
ada0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b  .      zStmt[k++
adb0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61  ] = ' ';.      a
adc0: 73 73 65 72 74 28 20 28 69 6e 74 29 28 73 71 6c  ssert( (int)(sql
add0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
ade0: 6b 2b 31 29 3c 3d 6e 20 29 3b 0a 20 20 20 20 20  k+1)<=n );.     
adf0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ae00: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
ae10: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
ae20: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
ae30: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 7d  rlen30(z);.    }
ae40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
ae50: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
ae60: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
ae70: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
ae80: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
ae90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
aea0: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
aeb0: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
aec0: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
aed0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
aee0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
aef0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
af00: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
af10: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
af20: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
af30: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
af40: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
af50: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
af60: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
af70: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
af80: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
af90: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
afa0: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
afb0: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
afc0: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
afd0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
afe0: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
aff0: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
b000: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
b010: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
b020: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
b030: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b040: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
b050: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
b060: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
b070: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
b080: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b090: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
b0a0: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
b0b0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
b0c0: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
b0d0: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
b0e0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b0f0: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
b100: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
b110: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
b120: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
b130: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
b140: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
b150: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
b160: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
b170: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
b180: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
b190: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
b1a0: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
b1b0: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
b1c0: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
b1d0: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
b1e0: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
b1f0: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
b200: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
b210: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b220: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
b230: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b240: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
b250: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
b260: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
b270: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
b280: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
b290: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
b2a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
b2b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b2c0: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
b2d0: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
b2e0: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
b2f0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
b300: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
b310: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
b320: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
b330: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
b340: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b350: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
b360: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45   iDb;..  if( (pE
b370: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
b380: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
b390: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
b3a0: 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20  ocFailed ) {.   
b3b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
b3c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b3d0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
b3e0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
b3f0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
b400: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
b410: 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c   );..  iDb = sql
b420: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
b430: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
b440: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
b450: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
b460: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
b470: 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
b480: 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
b490: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
b4a0: 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
b4b0: 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20    SrcList sSrc; 
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73    /* Fake SrcLis
b4e0: 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e  t for pParse->pN
b4f0: 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e  ewTable */.    N
b500: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b520: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
b530: 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  or pParse->pNewT
b540: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  able */..    mem
b550: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
b560: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d  eof(sNC));.    m
b570: 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20  emset(&sSrc, 0, 
b580: 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20  sizeof(sSrc));. 
b590: 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31     sSrc.nSrc = 1
b5a0: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
b5b0: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65  zName = p->zName
b5c0: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
b5d0: 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53  pTab = p;.    sS
b5e0: 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  rc.a[0].iCursor 
b5f0: 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50  = -1;.    sNC.pP
b600: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
b610: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
b620: 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43  = &sSrc;.    sNC
b630: 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20  .isCheck = 1;.  
b640: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
b650: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
b660: 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29  NC, p->pCheck) )
b670: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
b680: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
b690: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
b6a0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
b6b0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  */..  /* If the 
b6c0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
b6d0: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
b6e0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
b6f0: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
b700: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
b710: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
b720: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
b730: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
b740: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
b750: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
b760: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
b770: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
b780: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
b790: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
b7a0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
b7b0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
b7c0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
b7d0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
b7e0: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
b7f0: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
b800: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
b810: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
b820: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
b830: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
b840: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
b850: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
b860: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
b870: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
b880: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
b890: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
b8a0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
b8b0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63  tabase.  The rec
b8c0: 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ord number.  ** 
b8d0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b8e0: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61  e entry should a
b8f0: 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65  lready be on the
b900: 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
b910: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
b920: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
b930: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
b940: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
b950: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
b960: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
b970: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
b980: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
b990: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
b9a0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
b9b0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
b9c0: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
b9d0: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
b9e0: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
b9f0: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
ba00: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
ba10: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
ba20: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
ba30: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
ba40: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
ba50: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
ba60: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
ba70: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ba80: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
ba90: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
baa0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
bab0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20  OP_Close, 0);.. 
bac0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
bad0: 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
bae0: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20  e new table and 
baf0: 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
bb00: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41   stack..    ** A
bb10: 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f   view has no roo
bb20: 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70  tpage, so just p
bb30: 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20  ush a zero onto 
bb40: 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20  the stack for.  
bb50: 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69    ** views.  Ini
bb60: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74  tialize zType at
bb70: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
bb80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
bb90: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
bba0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
bbb0: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
bbc0: 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65    zType = "table
bbd0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
bbe0: 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64  = "TABLE";.#ifnd
bbf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
bc00: 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IEW.    }else{. 
bc10: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
bc20: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
bc30: 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54  "view";.      zT
bc40: 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23  ype2 = "VIEW";.#
bc50: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
bc60: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
bc70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
bc80: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20   AS SELECT ..., 
bc90: 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45  execute the SELE
bca0: 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  CT.    ** statem
bcb0: 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ent to populate 
bcc0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54  the new table. T
bcd0: 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  he root-page num
bce0: 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ber for the.    
bcf0: 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  ** new table is 
bd00: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
bd10: 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20  e vdbe stack..  
bd20: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
bd30: 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
bd40: 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
bd50: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
bd60: 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
bd70: 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
bd80: 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
bd90: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
bda0: 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
bdb0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
bdc0: 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
bdd0: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72  **.    ** A shar
bde0: 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c  ed-cache write-l
bdf0: 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ock is not requi
be00: 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  red to write to 
be10: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20  the new table,. 
be20: 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d     ** as a schem
be30: 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65  a-lock must have
be40: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62   already been ob
be50: 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65  tained to create
be60: 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a   it. Since.    *
be70: 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  * a schema-lock 
be80: 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
be90: 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72  er database user
bea0: 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  s, the write-loc
beb0: 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62  k would.    ** b
bec0: 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  e redundant..   
bed0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
bee0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ect ){.      Sel
bef0: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
bf00: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
bf10: 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ab;..      asser
bf20: 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d  t(pParse->nTab==
bf30: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
bf40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bf50: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
bf60: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
bf70: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
bf80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
bf90: 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50  (v, 1);.      pP
bfa0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
bfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
bfc0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
bfd0: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29  t, SRT_Table, 1)
bfe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
bff0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
c000: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20  elect, &dest);. 
c010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c020: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
c030: 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  se, 1);.      if
c040: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
c050: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65  0 ){.        pSe
c060: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
c070: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
c080: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
c090: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
c0a0: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
c0b0: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
c0c0: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
c0d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  .        p->nCol
c0e0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
c0f0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  ;.        p->aCo
c100: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
c110: 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
c120: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
c130: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
c140: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
c150: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
c160: 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20  ble(pSelTab);.  
c170: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c180: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
c190: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
c1a0: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
c1b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
c1c0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c1d0: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
c1e0: 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
c1f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c200: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
c210: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
c220: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
c230: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
c240: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c250: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43  b, .          "C
c260: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
c270: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
c280: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a  e->sNameToken.z.
c290: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
c2a0: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
c2b0: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
c2c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
c2d0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
c2e0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
c2f0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
c300: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
c310: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
c320: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
c330: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
c340: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20  've collected.  
c350: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
c360: 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20  e preallocated. 
c370: 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68     ** slot is th
c380: 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68  e 2nd item on th
c390: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f  e stack.  The to
c3a0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
c3b0: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  s the.    ** roo
c3c0: 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  t page for the n
c3d0: 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30  ew table (or a 0
c3e0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69   if this is a vi
c3f0: 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ew)..    */.    
c400: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
c410: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
c420: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
c430: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
c440: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
c450: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
c460: 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
c470: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
c480: 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
c490: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
c4a0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
c4b0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
c4c0: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
c4d0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
c4e0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
c4f0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
c500: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
c510: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
c520: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
c530: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c540: 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
c550: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
c560: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
c570: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c580: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
c590: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
c5a0: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
c5b0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
c5c0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
c5d0: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
c5e0: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
c5f0: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
c600: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
c610: 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
c620: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
c630: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
c640: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
c650: 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  iDb];.      if( 
c660: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
c670: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
c680: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
c690: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
c6a0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
c6b0: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
c6c0: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
c6d0: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
c6e0: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
c6f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
c700: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
c710: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
c720: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
c730: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
c740: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
c750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c760: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
c770: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
c780: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
c790: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
c7a0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
c7b0: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  ->zName), P4_DYN
c7c0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
c7d0: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
c7e0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
c7f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
c800: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
c810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c820: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
c830: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
c840: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
c850: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
c860: 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ; .    Schema *p
c870: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
c880: 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ema;.    pOld = 
c890: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
c8a0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
c8b0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20  ash, p->zName,. 
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c8e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a  te3Strlen30(p->z
c8f0: 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20 20 20  Name)+1,p);.    
c900: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
c910: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
c920: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
c930: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
c940: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
c950: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
c960: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
c970: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
c980: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
c9a0: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28  IGN_KEY.    for(
c9b0: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
c9c0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
c9d0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
c9e0: 20 20 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61        void *data
c9f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20  ;.      int nTo 
ca00: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ca10: 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  0(pFKey->zTo) + 
ca20: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
ca30: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
ca40: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
ca50: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  ma->aFKey, pFKey
ca60: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
ca70: 20 20 20 64 61 74 61 20 3d 20 73 71 6c 69 74 65     data = sqlite
ca80: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
ca90: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  hema->aFKey, pFK
caa0: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46  ey->zTo, nTo, pF
cab0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
cac0: 64 61 74 61 3d 3d 28 76 6f 69 64 20 2a 29 70 46  data==(void *)pF
cad0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 64  Key ){.        d
cae0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
caf0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
cb00: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
cb10: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
cb20: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
cb30: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
cb40: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
cb50: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
cb60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cb70: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
cb80: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
cb90: 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
cba0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
cbb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
cbc0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
cbd0: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
cbe0: 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
cbf0: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
cc00: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
cc10: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
cc20: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
cc30: 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
cc40: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
cc50: 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
cc60: 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
cc70: 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
cc80: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
cc90: 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
cca0: 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
ccb0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
ccc0: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
ccd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cce0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
ccf0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
cd00: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
cd10: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
cd20: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
cd30: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
cd40: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
cd50: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
cd60: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
cd70: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
cd80: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
cd90: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
cda0: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
cdb0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
cdc0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
cdd0: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
cde0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
cdf0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
ce00: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
ce10: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
ce20: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
ce30: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
ce40: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
ce50: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
ce60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
ce70: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
ce80: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
ce90: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
cea0: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
ceb0: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
cec0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
ced0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
cee0: 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
cef0: 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
cf00: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
cf10: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
cf20: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
cf30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
cf40: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
cf50: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
cf60: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20  Token *pName;.  
cf70: 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
cf80: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cf90: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
cfa0: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
cfb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
cfc0: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
cfd0: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
cfe0: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
cff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
d000: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d010: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d020: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
d030: 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
d040: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
d050: 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
d060: 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20  , noErr);.  p = 
d070: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
d080: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
d090: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
d0a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d0b0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d0c0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
d0d0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
d0e0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
d0f0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
d100: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
d110: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
d120: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
d130: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28  >pSchema);.  if(
d140: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
d150: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
d160: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
d170: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
d180: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
d190: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
d1a0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d1b0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d1c0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d1d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
d1e0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
d1f0: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
d200: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
d210: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
d220: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
d230: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
d240: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
d250: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
d260: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
d270: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
d280: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
d290: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
d2a0: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
d2b0: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
d2c0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
d2d0: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
d2e0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
d2f0: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
d300: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d310: 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
d320: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
d330: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
d340: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d350: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
d360: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d370: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d380: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
d390: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
d3a0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d3b0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
d3c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d3d0: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
d3e0: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
d3f0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
d400: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
d410: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
d420: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
d430: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
d440: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
d450: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
d460: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
d470: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
d480: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
d490: 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20   = (int)(sEnd.z 
d4a0: 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20  - pBegin->z);.  
d4b0: 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  z = (const unsig
d4c0: 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e  ned char*)pBegin
d4d0: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
d4e0: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
d4f0: 27 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 73 70  ' || sqlite3Issp
d500: 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20  ace(z[n-1])) ){ 
d510: 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
d520: 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
d530: 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
d540: 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
d550: 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
d560: 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
d570: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
d580: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
d590: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
d5a0: 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74  &sEnd, 0);.  ret
d5b0: 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
d5c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d5d0: 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
d5e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
d5f0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
d600: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
d610: 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
d620: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
d630: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
d640: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
d650: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
d660: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
d670: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
d680: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
d690: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
d6a0: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
d6b0: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
d6c0: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
d6d0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
d6e0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
d6f0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
d700: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
d710: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
d720: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
d730: 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
d740: 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
d750: 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
d760: 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
d770: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
d780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
d790: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
d7a0: 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
d7b0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
d7c0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
d7d0: 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
d7e0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
d7f0: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
d800: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
d810: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
d820: 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
d830: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
d840: 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
d850: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d860: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
d870: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
d880: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
d890: 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29  /.  int (*xAuth)
d8a0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
d8b0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d8c0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
d8d0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20  onst char*);..  
d8e0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
d8f0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
d900: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
d910: 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65  BLE.  if( sqlite
d920: 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
d930: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
d940: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d950: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
d960: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
d970: 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
d980: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
d990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d9a0: 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
d9b0: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
d9c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
d9d0: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
d9e0: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
d9f0: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
da00: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
da10: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
da20: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
da30: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
da40: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
da50: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
da60: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
da70: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
da80: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
da90: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
daa0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
dab0: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
dac0: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
dad0: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
dae0: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
daf0: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
db00: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
db10: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
db20: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
db30: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
db40: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
db50: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
db60: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
db70: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
db80: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
db90: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
dba0: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
dbb0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
dbc0: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
dbd0: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
dbe0: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
dbf0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
dc00: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
dc10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
dc20: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
dc30: 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
dc40: 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
dc50: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
dc60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
dc70: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
dc80: 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
dc90: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
dca0: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
dcb0: 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
dcc0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
dcd0: 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
dce0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
dcf0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
dd00: 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
dd10: 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
dd20: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
dd30: 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
dd40: 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
dd50: 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
dd60: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
dd70: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
dd80: 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
dd90: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
dda0: 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
ddb0: 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
ddc0: 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
ddd0: 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
dde0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
ddf0: 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
de00: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
de10: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
de20: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
de30: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
de40: 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
de50: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
de60: 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  le->pSelect, 0);
de70: 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20  .  if( pSel ){. 
de80: 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
de90: 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
dea0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
deb0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
dec0: 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
ded0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
dee0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
def0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
df00: 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64  ON.    xAuth = d
df10: 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62  b->xAuth;.    db
df20: 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
df30: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
df40: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
df50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
df60: 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
df70: 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
df80: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
df90: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
dfa0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
dfb0: 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
dfc0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
dfd0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
dfe0: 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
dff0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
e000: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
e010: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
e020: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
e030: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
e040: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
e050: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
e060: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
e070: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
e080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
e090: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
e0a0: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  b);.      pTable
e0b0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
e0c0: 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
e0d0: 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
e0e0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
e0f0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
e100: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
e110: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
e120: 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
e130: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
e140: 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rr++;.  }.#endif
e150: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e160: 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
e170: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
e180: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
e190: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
e1a0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
e1b0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
e1c0: 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
e1d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e1e0: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
e1f0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
e200: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
e210: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
e220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e230: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
e240: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
e250: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
e260: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
e270: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
e280: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
e290: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
e2a0: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
e2b0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
e2c0: 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
e2d0: 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
e2e0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
e2f0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
e300: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
e310: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
e320: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
e330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73  .      sqliteRes
e340: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
e350: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
e360: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
e370: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
e380: 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
e390: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
e3a0: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
e3b0: 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
e3c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
e3d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
e3e0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
e3f0: 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
e400: 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
e410: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
e420: 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
e430: 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
e440: 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
e450: 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
e460: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
e470: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
e480: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
e490: 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
e4a0: 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
e4b0: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
e4c0: 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
e4d0: 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
e4e0: 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
e4f0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
e500: 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
e510: 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
e520: 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
e530: 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
e540: 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
e550: 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
e560: 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
e570: 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
e580: 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
e590: 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
e5a0: 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
e5b0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
e5c0: 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
e5d0: 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
e5e0: 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
e5f0: 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
e600: 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
e610: 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
e620: 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
e630: 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
e640: 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
e650: 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
e660: 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
e670: 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
e680: 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
e690: 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
e6a0: 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
e6b0: 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
e6c0: 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
e6d0: 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
e6e0: 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
e6f0: 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
e700: 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
e710: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
e720: 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
e730: 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
e740: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e750: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e760: 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
e770: 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62  RootPageMoved(Db
e780: 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d   *pDb, int iFrom
e790: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
e7a0: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
e7b0: 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20   Hash *pHash;.. 
e7c0: 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
e7d0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
e7e0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
e7f0: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
e800: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
e810: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
e820: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
e830: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
e840: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
e850: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
e860: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
e870: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
e880: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
e890: 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
e8a0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
e8b0: 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
e8c0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
e8d0: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
e8e0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
e8f0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
e900: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
e910: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
e920: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
e930: 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
e940: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
e950: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
e960: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
e970: 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
e980: 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
e990: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
e9a0: 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
e9b0: 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
e9c0: 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
e9d0: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
e9e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e9f0: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
ea00: 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
ea10: 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
ea20: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
ea30: 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
ea40: 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
ea50: 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
ea60: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
ea70: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
ea80: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
ea90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
eaa0: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
eab0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
eac0: 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
ead0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
eae0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
eaf0: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
eb00: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
eb10: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
eb20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
eb30: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
eb40: 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b  Table, r1, iDb);
eb50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eb60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
eb70: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
eb80: 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74  stores an in int
eb90: 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73  eger r1. If this
eba0: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
ebb0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
ebc0: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
ebd0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
ebe0: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
ebf0: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
ec00: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
ec10: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
ec20: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
ec30: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
ec40: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
ec50: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 25   **.  ** The "#%
ec60: 64 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  d" in the SQL is
ec70: 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
ec80: 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
ec90: 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
eca0: 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  ** is on the top
ecb0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
ecc0: 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73  See sqlite3Regis
ecd0: 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a  terExpr()..  */.
ece0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
ecf0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
ed00: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
ed10: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
ed20: 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
ed30: 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
ed40: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
ed50: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
ed60: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
ed70: 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
ed80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
ed90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
eda0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
edb0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
edc0: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
edd0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
ede0: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
edf0: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
ee00: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
ee10: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
ee20: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
ee30: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
ee40: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
ee50: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
ee60: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
ee70: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
ee80: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
ee90: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
eea0: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
eeb0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
eec0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
eed0: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
eee0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
eef0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
ef00: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
ef10: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
ef20: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ef30: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
ef40: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
ef50: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
ef60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
ef70: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
ef80: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
ef90: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
efa0: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
efb0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
efc0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
efd0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
efe0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
eff0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
f000: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
f010: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
f020: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
f030: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
f040: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
f050: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f060: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
f070: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
f080: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
f090: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
f0a0: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
f0b0: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
f0c0: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
f0d0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
f0e0: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
f0f0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
f100: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
f110: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
f120: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
f130: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
f140: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
f150: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
f160: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
f170: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
f180: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
f190: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
f1a0: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
f1b0: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
f1c0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
f1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
f1e0: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
f1f0: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
f200: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f210: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
f220: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
f230: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
f240: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
f250: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
f260: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
f270: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
f280: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
f290: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
f2a0: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
f2b0: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
f2c0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
f2d0: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
f2e0: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
f2f0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
f300: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
f310: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
f320: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
f330: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
f340: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
f350: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
f360: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
f370: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
f380: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
f390: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
f3a0: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
f3b0: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
f3c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f3d0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
f3e0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
f3f0: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
f400: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
f410: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
f420: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
f430: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
f440: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
f450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
f460: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
f470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
f480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f490: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
f4a0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
f4b0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f4c0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
f4d0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
f4e0: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
f4f0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
f500: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
f510: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
f520: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f540: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
f550: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
f560: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
f570: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
f580: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
f590: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
f5a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f5b0: 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
f5c0: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
f5d0: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
f5e0: 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
f5f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
f600: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
f610: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
f620: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
f630: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
f640: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
f650: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f660: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f670: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
f680: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
f690: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
f6a0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
f6b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69  ble(pParse, isVi
f6c0: 65 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ew, .           
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
f6f0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
f700: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
f710: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
f720: 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20    if( noErr ){. 
f730: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f740: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
f750: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65      }.    goto e
f760: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f770: 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
f780: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f790: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
f7a0: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
f7b0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
f7c0: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nDb );..  /* If
f7d0: 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
f7e0: 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
f7f0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
f800: 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
f810: 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
f820: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
f830: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
f840: 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
f850: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
f860: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
f870: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f880: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
f890: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f8a0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
f8b0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
f8c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f8d0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
f8e0: 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
f8f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
f900: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
f910: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
f920: 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
f930: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
f940: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f950: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
f960: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
f970: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f980: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
f990: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
f9a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
f9b0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
f9c0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
f9d0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f9e0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
f9f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fa00: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fa10: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
fa20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
fa30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
fa40: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
fa50: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
fa60: 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
fa70: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
fa80: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
fa90: 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d  g2 = pTab->pMod-
faa0: 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
fab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fac0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
fad0: 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
fae0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
faf0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
fb00: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
fb10: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
fb20: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
fb30: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
fb40: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
fb50: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
fb60: 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
fb70: 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
fb80: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
fb90: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
fba0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
fbb0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
fbc0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
fbd0: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
fbe0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
fbf0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
fc00: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
fc10: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
fc20: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
fc30: 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
fc40: 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
fc50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
fc60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
fc70: 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
fc80: 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
fc90: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
fca0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
fcb0: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
fcc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
fcd0: 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
fce0: 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
fcf0: 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
fd00: 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
fd10: 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
fd20: 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
fd30: 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
fd40: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
fd50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
fd60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fd70: 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
fd80: 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
fd90: 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
fda0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
fdb0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
fdc0: 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
fdd0: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
fde0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
fdf0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fe00: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
fe10: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
fe20: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
fe30: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
fe40: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
fe50: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
fe60: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
fe70: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
fe80: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
fe90: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
fea0: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
feb0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
fec0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
fed0: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
fee0: 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20 2a  rigger;.    Db *
fef0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
ff00: 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db];.    sqlite3
ff10: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
ff20: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
ff30: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
ff40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ff50: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49  LTABLE.    if( I
ff60: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
ff70: 7b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29 7b  {.      if( v ){
ff80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff90: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
ffa0: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 20 20  _VBegin);.      
ffb0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
ffc0: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
ffd0: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
ffe0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
fff0: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
10000 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
10010 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
10020 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
10030 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
10040 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
10050 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
10060 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
10070 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
10080 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
10090 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
100a0 54 61 62 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  Tab);.    while(
100b0 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
100c0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
100d0 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
100e0 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
100f0 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67            pTrigg
10100 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
10110 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
10120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10130 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
10140 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
10150 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
10160 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
10170 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
10180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10190 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
101a0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
101b0 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
101c0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
101d0 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
101e0 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
101f0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
10200 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
10210 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
10220 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
10230 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
10240 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
10250 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
10260 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
10270 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
10280 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
10290 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
102a0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
102b0 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
102c0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61      if( pTab->ta
102d0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
102e0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
102f0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
10300 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10310 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
10320 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71  OM %s.sqlite_seq
10330 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
10340 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44  =%Q",.        pD
10350 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
10360 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
10370 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10380 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
10390 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
103a0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
103b0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
103c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c   the.    ** tabl
103d0 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
103e0 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
103f0 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
10400 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
10410 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20     ** every row 
10420 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10430 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
10440 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
10450 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  ne being.    ** 
10460 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
10470 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
10480 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  perately because
10490 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
104a0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
104b0 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
104c0 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
104d0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
104e0 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  another.    ** d
104f0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
10500 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10510 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
10520 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
10530 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
10540 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
10550 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
10560 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
10570 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
10580 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
10590 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
105a0 44 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73 74  Drop any statist
105b0 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ics from the sql
105c0 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c  ite_stat1 table,
105d0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
105e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
105f0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73  FindTable(db, "s
10600 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62  qlite_stat1", db
10610 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
10620 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10630 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10640 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
10650 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
10660 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45  lite_stat1 WHERE
10670 20 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a   tbl=%Q", pDb->z
10680 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
10690 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
106a0 0a 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ..    if( !isVie
106b0 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
106c0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64  pTab) ){.      d
106d0 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
106e0 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  se, pTab);.    }
106f0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
10700 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
10710 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
10720 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
10730 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20  d modify.    ** 
10740 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
10750 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
10760 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
10770 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10780 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10790 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
107a0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
107b0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
107c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
107d0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
107e0 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
107f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
10810 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
10820 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
10830 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
10840 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
10850 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
10860 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
10870 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
10880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
10890 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
108a0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
108b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
108c0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
108d0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
108e0 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
108f0 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
10900 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
10910 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
10920 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
10930 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
10940 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
10950 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
10960 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
10970 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
10980 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
10990 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
109a0 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
109b0 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
109c0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
109d0 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
109e0 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
109f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
10a00 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
10a10 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
10a20 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
10a30 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
10a40 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
10a50 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
10a60 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
10a70 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
10a80 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
10a90 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
10aa0 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
10ab0 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
10ac0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
10ad0 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
10ae0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
10af0 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
10b00 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
10b10 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
10b20 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
10b30 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
10b40 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
10b50 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
10b60 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
10b70 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a  3EndTable()..**.
10b80 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
10b90 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
10ba0 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
10bb0 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
10bc0 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
10bd0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
10be0 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
10bf0 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
10c00 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
10c10 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
10c20 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
10c30 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
10c40 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10c50 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10c60 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
10c70 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
10c80 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
10c90 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
10ca0 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
10cb0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10cc0 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
10cd0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
10ce0 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
10cf0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
10d00 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
10d10 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
10d20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
10d30 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
10d40 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
10d50 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10d60 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
10d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
10d80 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
10d90 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
10da0 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
10db0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
10dc0 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
10dd0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
10de0 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
10df0 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
10e00 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
10e10 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44  se->nErr || IN_D
10e20 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
10e30 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
10e40 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
10e50 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
10e60 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
10e70 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
10e80 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
10e90 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
10ea0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
10eb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10ec0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
10ed0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
10ee0 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
10ef0 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
10f00 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
10f10 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
10f20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
10f30 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
10f40 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
10f50 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
10f60 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
10f70 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
10f80 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
10f90 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
10fa0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10fb0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10fc0 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
10fd0 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
10fe0 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
10ff0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
11000 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
11010 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
11020 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
11030 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
11050 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
11060 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
11070 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
11080 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
11090 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
110a0 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
110b0 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
110c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
110d0 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
110e0 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
110f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11100 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
11110 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
11120 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
11130 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
11140 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
11150 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
11160 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
11170 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
11180 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
11190 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
111a0 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
111b0 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
111c0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
111d0 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
111e0 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
111f0 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
11200 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
11210 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
11220 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
11230 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
11240 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
11250 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
11260 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
11270 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
11280 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
11290 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
112a0 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
112b0 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
112c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
112d0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
112e0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
112f0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
11300 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
11310 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
11320 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
11330 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
11340 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
11350 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
11360 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
11370 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
11380 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
113a0 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
113b0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
113c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
113d0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
113e0 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
113f0 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
11400 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
11410 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
11420 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
11430 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
11440 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11460 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
11470 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11480 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11490 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
114a0 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
114b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
114c0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
114d0 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
114e0 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
114f0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
11500 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
11510 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
11520 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
11530 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
11540 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
11550 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 28 75  >deleteConf = (u
11560 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29  8)(flags & 0xff)
11570 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
11580 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 28 66 6c  eConf = (u8)((fl
11590 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
115a0 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  f);.  pFKey->ins
115b0 65 72 74 43 6f 6e 66 20 3d 20 28 75 38 29 28 28  ertConf = (u8)((
115c0 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20  flags >> 16 ) & 
115d0 30 78 66 66 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  0xff);..  /* Lin
115e0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
115f0 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
11600 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
11610 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
11620 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
11630 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
11640 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11650 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
11660 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
11670 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11680 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
11690 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
116a0 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
116b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
116c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
116d0 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
116e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
116f0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
11700 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
11710 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
11720 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
11730 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
11740 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
11750 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
11760 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
11770 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
11780 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
11790 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
117a0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
117b0 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
117c0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
117d0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
117e0 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
117f0 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
11800 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
11810 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
11820 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
11830 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11840 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
11850 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11860 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
11870 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
11880 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
11890 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
118a0 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
118b0 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
118c0 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
118d0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
118e0 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
118f0 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 0a  sDeferred==1 );.
11900 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
11910 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
11920 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
11930 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11940 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
11950 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
11960 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
11970 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
11980 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
11990 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
119a0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
119b0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
119c0 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
119d0 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
119e0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
119f0 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
11a00 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
11a10 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
11a20 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
11a30 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
11a40 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
11a50 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
11a60 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
11a70 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
11a80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
11a90 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
11aa0 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
11ab0 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
11ac0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
11ad0 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
11ae0 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
11af0 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
11b00 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
11b10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11b20 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
11b30 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
11b40 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
11b50 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
11b60 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
11b70 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
11b80 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
11b90 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
11ba0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
11bb0 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
11bc0 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
11bd0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
11be0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
11bf0 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
11c00 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
11c10 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
11c20 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
11c30 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
11c40 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
11c50 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
11c60 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c80 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
11c90 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
11ca0 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11cc0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
11cd0 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
11d00 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
11d10 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11d20 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
11d30 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
11d40 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
11d50 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
11d60 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20 20  nt regIdxKey;   
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d80 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61   Registers conta
11d90 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
11da0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  key */.  int reg
11db0 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
11dc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11dd0 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
11de0 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
11df0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
11e00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11e10 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
11e20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11e30 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
11e40 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
11e50 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
11e60 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
11e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11e80 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
11e90 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11ea0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
11eb0 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
11ec0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
11ed0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
11ee0 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
11ef0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
11f00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
11f10 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
11f20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
11f30 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
11f40 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
11f50 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
11f60 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
11f70 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
11f80 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
11f90 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11fa0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
11fb0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
11fc0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
11fd0 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
11fe0 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
11ff0 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
12000 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
12010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12020 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
12030 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
12040 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
12050 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
12060 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
12070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12080 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
12090 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
120a0 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
120b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
120c0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
120d0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
120e0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
120f0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12100 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12110 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
12120 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
12130 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
12140 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
12150 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
12160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12170 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
12180 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  , 0);.  regRecor
12190 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
121a0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
121b0 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71 6c   regIdxKey = sql
121c0 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
121d0 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e  xKey(pParse, pIn
121e0 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65  dex, iTab, regRe
121f0 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28 20  cord, 1);.  if( 
12200 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
12210 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
12220 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
12230 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
12240 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65     regRowid = re
12250 67 49 64 78 4b 65 79 20 2b 20 70 49 6e 64 65 78  gIdxKey + pIndex
12260 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 6a  ->nColumn;.    j
12270 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
12280 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp3(v, OP_IsNu
12290 6c 6c 2c 20 72 65 67 49 64 78 4b 65 79 2c 20 30  ll, regIdxKey, 0
122a0 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  , pIndex->nColum
122b0 6e 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c  n);.    j2 = sql
122c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
122d0 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69  , OP_IsUnique, i
122e0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 30 2c 20 72 65 67 52 6f 77 69 64 2c 20 53 51 4c  0, regRowid, SQL
12310 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72  ITE_INT_TO_PTR(r
12320 65 67 52 65 63 6f 72 64 29 2c 20 50 34 5f 49 4e  egRecord), P4_IN
12330 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T32);.    sqlite
12340 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12350 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
12360 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41 62  ONSTRAINT, OE_Ab
12370 6f 72 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ort, 0,.        
12380 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64              "ind
12390 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
123a0 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 34   not unique", P4
123b0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
123c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
123d0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
123e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
123f0 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 0a 20 20  e(v, j2);.  }.  
12400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12410 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
12420 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f  t, iIdx, regReco
12430 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
12440 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
12450 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
12460 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12470 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
12480 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
12490 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
124a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
124b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
124c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
124d0 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
124e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
124f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
12500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
12510 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
12520 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
12530 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
12540 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
12550 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
12560 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
12570 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
12580 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
12590 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
125a0 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
125b0 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
125c0 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
125d0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
125e0 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
125f0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
12600 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
12610 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
12620 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
12630 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
12640 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
12650 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
12660 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
12670 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
12680 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
12690 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
126a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
126b0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
126c0 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
126d0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
126e0 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
126f0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
12700 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
12710 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
12720 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
12730 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
12740 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
12750 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
12760 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
12770 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
12780 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
12790 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
127a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
127b0 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
127c0 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
127d0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
127e0 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
127f0 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
12800 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
12810 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
12820 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
12830 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
12840 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
12850 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
12860 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
12870 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
12880 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
12890 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
128a0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
128b0 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
128c0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
128d0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
128e0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
128f0 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
12900 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
12910 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
12920 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
12930 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
12940 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
12950 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
12960 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
12970 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54  pEnd,       /* T
12980 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
12990 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
129a0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
129b0 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
129c0 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
129d0 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
129e0 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
129f0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
12a00 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f  otExist     /* O
12a10 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
12a20 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
12a30 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
12a40 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
12a50 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
12a60 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
12a70 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
12a80 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
12a90 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
12aa0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
12ab0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
12ac0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
12ad0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
12ae0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12af0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
12b00 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
12b10 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
12b20 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61  Id;        /* Fa
12b30 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
12b40 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
12b50 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
12b60 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
12b70 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
12b80 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
12b90 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  e */.  int sortO
12ba0 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31  rderMask;   /* 1
12bb0 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69   to honor DESC i
12bc0 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69  n index.  0 to i
12bd0 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  gnore. */.  sqli
12be0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12bf0 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b  ->db;.  Db *pDb;
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c10 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62  The specific tab
12c20 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
12c30 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61  e indexed databa
12c40 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c60 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  Index of the dat
12c70 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65  abase that is be
12c80 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ing written */. 
12c90 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
12ca0 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  0;    /* Unquali
12cb0 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
12cc0 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
12cd0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
12ce0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73  rList_item *pLis
12cf0 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f  tItem; /* For lo
12d00 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74  oping over pList
12d10 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   */.  int nCol;.
12d20 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
12d30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  ;.  char *zExtra
12d40 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
12d50 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
12d60 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f  locFailed || IN_
12d70 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
12d80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12d90 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
12da0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
12db0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
12dc0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
12dd0 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
12de0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
12df0 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
12e00 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
12e10 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
12e20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
12e30 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
12e40 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
12e50 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
12e60 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
12e70 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
12e80 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
12e90 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
12ea0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
12eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
12ec0 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
12ed0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
12ee0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
12ef0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
12f00 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
12f10 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
12f20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12f30 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20  index;..#ifndef 
12f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
12f50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
12f60 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
12f70 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
12f80 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
12f90 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
12fa0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
12fb0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
12fc0 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
12fd0 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
12fe0 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
12ff0 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
13000 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
13010 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
13020 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
13030 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
13040 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
13050 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
13060 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
13070 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
13080 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
13090 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
130a0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
130b0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
130c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
130d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
130e0 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
130f0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64  Parse, iDb, "ind
13100 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20  ex", pName) &&. 
13110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69         sqlite3Fi
13120 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
13130 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b  pTblName).    ){
13140 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
13150 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  e the parser con
13160 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65  structs pTblName
13170 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
13180 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20  dentifier,.     
13190 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72   ** sqlite3FixSr
131a0 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20  cList can never 
131b0 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fail. */.      a
131c0 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
131d0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
131e0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
131f0 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e 61 6d  arse, 0, pTblNam
13200 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a  e->a[0].zName, .
13210 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65          pTblName
13220 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
13230 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
13240 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
13250 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
13260 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13270 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
13280 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d  Db[iDb].pSchema=
13290 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
132a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
132b0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
132c0 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
132d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
132e0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
132f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13300 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
13310 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
13320 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
13330 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
13340 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
13350 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54  [iDb];..  if( pT
13360 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
13370 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
13380 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13390 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
133a0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
133b0 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
133c0 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 6d  ==0 .       && m
133d0 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  emcmp(&pTab->zNa
133e0 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f  me[7],"altertab_
133f0 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  ",9)!=0 ){.    s
13400 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13410 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
13420 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
13430 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
13440 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
13450 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13460 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13470 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
13480 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
13490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
134a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
134b0 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
134c0 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
134d0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
134e0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
134f0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
13500 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13510 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
13520 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
13530 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13540 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
13550 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
13560 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
13570 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13580 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
13590 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
135a0 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
135b0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
135c0 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
135d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
135e0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
135f0 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
13600 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
13610 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
13620 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
13630 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
13640 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
13650 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
13660 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
13670 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
13680 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
13690 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
136a0 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
136b0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
136c0 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
136d0 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
136e0 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
136f0 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
13700 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
13710 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
13720 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
13730 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
13740 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
13750 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
13760 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
13770 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
13780 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
13790 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
137a0 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
137b0 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
137c0 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
137d0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
137e0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
137f0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
13800 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
13810 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
13820 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
13830 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13840 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
13850 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13860 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
13870 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
13880 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
13890 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
138a0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
138b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
138c0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
138d0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
138e0 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  y ){.      if( S
138f0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
13900 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
13910 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
13920 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13930 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
13940 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
13950 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
13960 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13970 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
13980 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
13990 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
139a0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
139b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
139c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
139d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
139e0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
139f0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
13a00 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
13a10 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
13a20 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
13a30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13a40 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
13a50 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
13a60 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
13a70 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
13a80 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13a90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
13aa0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
13ab0 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
13ac0 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
13ad0 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
13ae0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
13af0 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
13b00 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
13b10 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
13b20 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
13b30 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
13b40 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
13b50 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
13b60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13b70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
13b80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
13b90 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
13ba0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
13bb0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
13bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13bd0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
13be0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
13bf0 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
13c00 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
13c10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
13c20 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
13c30 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
13c40 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
13c50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13c60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13c70 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
13c80 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
13c90 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
13ca0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
13cb0 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
13cc0 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
13cd0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13ce0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13cf0 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
13d00 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
13d10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13d20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13d30 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13d40 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
13d50 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
13d60 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
13d70 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
13d80 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
13d90 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
13da0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
13db0 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
13dc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
13dd0 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
13de0 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
13df0 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
13e00 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13e10 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
13e20 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c   (u8*)pTab->aCol
13e30 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
13e40 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
13e50 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
13e60 65 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c  en30((char*)null
13e70 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
13e80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
13e90 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
13ea0 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b   0, 0, &nullId);
13eb0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
13ec0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
13ed0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13ee0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
13ef0 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74  Order = (u8)sort
13f00 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
13f10 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
13f20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
13f30 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
13f40 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
13f50 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
13f60 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
13f70 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
13f80 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
13f90 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
13fa0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
13fb0 78 70 72 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  xpr;.    CollSeq
13fc0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28   *pColl;.    if(
13fd0 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
13fe0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 21 3d 30 20  >a[i].pExpr)!=0 
13ff0 26 26 20 28 70 43 6f 6c 6c 20 3d 20 70 45 78 70  && (pColl = pExp
14000 72 2d 3e 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a  r->pColl)!=0 ){.
14010 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
14020 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
14030 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  en30(pColl->zNam
14040 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  e));.    }.  }..
14050 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
14060 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
14070 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
14080 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
14090 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
140a0 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  .  nCol = pList-
140b0 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
140c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
140d0 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20  ocZero(db, .    
140e0 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20    sizeof(Index) 
140f0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
14100 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
14110 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  e  */.      size
14120 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20  of(int)*nCol +  
14130 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14140 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
14150 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
14160 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20  )*(nCol+1) +    
14170 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
14180 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
14190 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e  sizeof(char *)*n
141a0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  Col +        /* 
141b0 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
141c0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
141d0 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  (u8)*nCol +     
141e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
141f0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
14200 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20      nName + 1 + 
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20   /* Index.zName 
14230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45       */.      nE
14240 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
14250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14260 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14270 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20   names */.  );. 
14280 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14290 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
142a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
142b0 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
142c0 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
142d0 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29  r**)(&pIndex[1])
142e0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
142f0 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26  lumn = (int *)(&
14300 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  pIndex->azColl[n
14310 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
14320 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73  >aiRowEst = (uns
14330 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78  igned *)(&pIndex
14340 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d  ->aiColumn[nCol]
14350 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  );.  pIndex->aSo
14360 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
14370 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  (&pIndex->aiRowE
14380 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70  st[nCol+1]);.  p
14390 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
143a0 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
143b0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
143c0 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28  ]);.  zExtra = (
143d0 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
143e0 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29  >zName[nName+1])
143f0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
14400 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
14410 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
14420 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
14430 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
14440 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
14450 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
14460 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
14470 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
14480 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38  >autoIndex = (u8
14490 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70  )(pName==0);.  p
144a0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d  Index->pSchema =
144b0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
144c0 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65  chema;..  /* Che
144d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
144e0 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53  should honor DES
144f0 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e  C requests on in
14500 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  dex columns.  */
14510 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
14520 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
14530 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f  >=4 ){.    sortO
14540 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20  rderMask = -1;  
14550 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a   /* Honor DESC *
14560 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
14570 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30  ortOrderMask = 0
14580 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44  ;    /* Ignore D
14590 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ESC */.  }..  /*
145a0 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
145b0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
145c0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
145d0 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
145e0 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
145f0 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
14600 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
14610 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
14620 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
14630 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
14640 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  found..  */.  fo
14650 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
14660 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
14670 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
14680 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
14690 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
146a0 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74  olName = pListIt
146b0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43  em->zName;.    C
146c0 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
146d0 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
146e0 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  dSortOrder;.    
146f0 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14710 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
14720 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
14730 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43    for(j=0, pTabC
14740 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
14750 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
14760 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
14770 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
14780 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c  trICmp(zColName,
14790 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29   pTabCol->zName)
147a0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
147b0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
147c0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
147d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
147e0 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
147f0 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
14800 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
14810 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
14820 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  , zColName);.   
14830 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14840 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
14850 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 20 41  .    /* TODO:  A
14860 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d 61 6b  dd a test to mak
14870 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
14880 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  same column is n
14890 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  ot named.    ** 
148a0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77  more than once w
148b0 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69  ithin the same i
148c0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
148d0 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f  first instance o
148e0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c  f.    ** the col
148f0 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65  umn will ever be
14900 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 74   used by the opt
14910 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68  imizer.  Note th
14920 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20  at using the.   
14930 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20   ** same column 
14940 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63  more than once c
14950 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f  annot be an erro
14960 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  r because that w
14970 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62 72 65  ould .    ** bre
14980 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ak backwards com
14990 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20  patibility - it 
149a0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61  needs to be a wa
149b0 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  rning..    */.  
149c0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
149d0 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69  mn[i] = j;.    i
149e0 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
149f0 78 70 72 20 26 26 20 70 4c 69 73 74 49 74 65 6d  xpr && pListItem
14a00 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  ->pExpr->pColl )
14a10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14a20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
14a30 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
14a40 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
14a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
14a60 6e 70 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20  nprintf(nExtra, 
14a70 7a 45 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c  zExtra, "%s", pL
14a80 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
14a90 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
14aa0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28       zExtra += (
14ab0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14ac0 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20  zColl) + 1);.   
14ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
14ae0 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
14af0 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
14b00 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
14b10 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
14b20 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
14b30 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
14b40 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
14b50 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
14b60 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
14b70 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
14b80 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67  , -1) ){.      g
14b90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14ba0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
14bb0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
14bc0 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
14bd0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
14be0 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
14bf0 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
14c00 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
14c10 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
14c20 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
14c30 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
14c40 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
14c50 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
14c60 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
14c70 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
14c80 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14c90 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
14ca0 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
14cb0 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
14cc0 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
14cd0 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
14ce0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
14cf0 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
14d00 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
14d10 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
14d20 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
14d30 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
14d40 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
14d50 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
14d60 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
14d70 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
14d80 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
14d90 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
14da0 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
14db0 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
14dc0 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
14dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
14de0 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
14df0 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
14e00 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
14e10 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
14e20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
14e30 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
14e40 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
14e50 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
14e60 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
14e70 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
14e80 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
14e90 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
14ea0 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
14eb0 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
14ec0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
14ed0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
14ee0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
14ef0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
14f00 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
14f10 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
14f20 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
14f30 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
14f40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
14f50 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
14f60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
14f70 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
14f80 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
14f90 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
14fa0 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
14fb0 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
14fc0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
14fd0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
14fe0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
14ff0 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70 49  st char *z1 = pI
15000 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
15010 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15020 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e  r *z2 = pIndex->
15030 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
15040 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
15050 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
15060 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
15070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
15080 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  f( pIdx->aSortOr
15090 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  der[k]!=pIndex->
150a0 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20  aSortOrder[k] ) 
150b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
150c0 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c  f( z1!=z2 && sql
150d0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
150e0 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
150f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
15100 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
15110 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
15120 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
15130 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
15140 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
15150 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
15160 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
15170 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
15180 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
15190 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
151a0 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
151b0 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
151c0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
151d0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
151e0 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
151f0 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
15200 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
15210 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
15220 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
15230 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
15240 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
15250 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
15260 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
15270 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
15280 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
15290 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
152a0 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
152b0 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
152c0 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
152d0 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69  aviour for the i
152e0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
152f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
15300 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
15310 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
15320 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
15330 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
15340 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15350 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15360 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
15370 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
15380 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
15390 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
153a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
153b0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
153c0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
153d0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
153e0 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
153f0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
15400 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
15410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15420 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
15430 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15450 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
15460 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
15470 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
15480 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
15490 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
154a0 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
154b0 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
154c0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
154d0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
154e0 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
154f0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
15500 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
15510 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
15540 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15550 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
15560 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
15580 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
15590 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
155a0 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
155b0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
155c0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
155d0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
155e0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
155f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15600 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
15610 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
15620 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
15630 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
15640 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
15650 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
15660 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
15670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15680 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
15690 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
156a0 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
156b0 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
156c0 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
156d0 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
156e0 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
156f0 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
15700 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
15710 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
15720 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
15730 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
15740 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
15750 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
15760 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
15770 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
15780 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
15790 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
157a0 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
157b0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
157c0 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
157d0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
157e0 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
157f0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
15800 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
15810 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
15820 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
15830 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
15840 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
15850 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
15860 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
15870 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
15880 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
15890 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
158a0 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
158b0 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
158c0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
158d0 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
158e0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
158f0 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
15900 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
15910 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
15920 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
15930 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
15940 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
15950 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
15960 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
15970 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
15980 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56  busy==0 ){.    V
15990 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
159a0 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
159b0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
159c0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
159d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
159e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
159f0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
15a00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15a10 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
15a20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
15a30 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
15a40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
15a50 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
15a60 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
15a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15a80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
15a90 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
15aa0 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  iMem);..    /* G
15ab0 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
15ac0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
15ad0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
15ae0 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
15af0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
15b00 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
15b10 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
15b20 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nd ){.      /* A
15b30 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
15b40 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
15b50 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
15b60 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
15b70 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
15b80 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
15b90 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
15ba0 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
15bb0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
15bc0 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20  " UNIQUE",.     
15bd0 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61     pEnd->z - pNa
15be0 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20  me->z + 1,.     
15bf0 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20     pName->z);.  
15c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
15c10 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
15c20 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
15c30 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
15c40 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
15c50 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
15c60 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
15c70 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
15c80 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
15c90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
15ca0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
15cb0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
15cc0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
15cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
15ce0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
15cf0 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
15d00 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
15d10 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
15d20 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
15d30 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
15d40 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
15d50 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
15d60 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
15d70 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
15d80 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
15d90 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
15da0 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
15db0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15dc0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
15dd0 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
15de0 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
15df0 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
15e00 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
15e10 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
15e20 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
15e30 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
15e40 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
15e50 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
15e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
15e70 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
15e80 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
15e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
15ea0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
15eb0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
15ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15ed0 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
15ee0 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20  a, iDb, 0, 0,.  
15ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
15f00 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
15f10 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  '%q'", pIndex->z
15f20 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49  Name), P4_DYNAMI
15f30 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
15f40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15f50 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20  P_Expire, 0);.  
15f60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
15f70 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
15f80 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
15f90 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
15fa0 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
15fb0 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
15fc0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
15fd0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
15fe0 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
15ff0 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
16000 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
16010 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
16020 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
16030 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
16040 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
16050 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
16060 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
16070 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
16080 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
16090 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
160a0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
160b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
160c0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
160d0 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
160e0 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
160f0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
16100 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
16110 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
16120 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
16130 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
16140 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
16150 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
16160 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
16170 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
16180 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
16190 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
161a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
161b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
161c0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
161d0 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
161e0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
161f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
16200 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
16210 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
16220 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
16230 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
16240 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
16250 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
16260 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
16270 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
16280 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
16290 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
162a0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
162b0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
162c0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
162d0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
162e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
162f0 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  de to make sure 
16300 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
16310 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c 65 61  number is at lea
16320 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a  st minFormat..**
16330 20 54 68 65 20 67 65 6e 65 72 61 74 65 64 20 63   The generated c
16340 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ode will increas
16350 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  e the file forma
16360 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65 63 65  t number if nece
16370 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ssary..*/.void s
16380 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c  qlite3MinimumFil
16390 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20 2a 70  eFormat(Parse *p
163a0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c 20  Parse, int iDb, 
163b0 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a  int minFormat){.
163c0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d    Vdbe *v;.  v =
163d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
163e0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
163f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d   ){.    int r1 =
16400 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16410 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16420 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
16430 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16440 65 29 3b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a  e);.    int j1;.
16450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16460 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
16470 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 31 2c  Cookie, iDb, r1,
16480 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
16490 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
164a0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
164b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
164c0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46  OP_Integer, minF
164d0 6f 72 6d 61 74 2c 20 72 32 29 3b 0a 20 20 20 20  ormat, r2);.    
164e0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
164f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c  AddOp3(v, OP_Ge,
16500 20 72 32 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20   r2, 0, r1);.   
16510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16520 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
16530 69 65 2c 20 69 44 62 2c 20 31 2c 20 72 32 29 3b  ie, iDb, 1, r2);
16540 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16550 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
16560 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
16570 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16580 65 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  e, r1);.    sqli
16590 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
165a0 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
165b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c   }.}../*.** Fill
165c0 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
165d0 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
165e0 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
165f0 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
16600 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
16610 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
16620 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
16630 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
16640 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
16650 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61  suppose to conta
16660 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
16670 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
16680 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65   index..** Since
16690 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c   we do not know,
166a0 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e   guess 1 million
166b0 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69  .  aiRowEst[1] i
166c0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
166d0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
166e0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
166f0 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61  ble that match a
16700 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  ny particular va
16710 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  lue of the.** fi
16720 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
16730 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45  e index.  aiRowE
16740 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69  st[2] is an esti
16750 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
16760 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68  er.** of rows th
16770 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
16780 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61  ticular combinia
16790 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
167a0 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
167b0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
167c0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
167d0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
167e0 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
167f0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
16800 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
16810 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
16820 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
16830 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
16840 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
16850 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
16860 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
16870 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
16880 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
16890 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
168a0 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
168b0 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
168c0 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
168d0 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
168e0 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
168f0 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
16900 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
16910 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
16920 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20  {.  unsigned *a 
16930 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  = pIdx->aiRowEst
16940 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
16950 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61  ert( a!=0 );.  a
16960 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20  [0] = 1000000;. 
16970 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f   for(i=pIdx->nCo
16980 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29  lumn; i>=5; i--)
16990 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a  {.    a[i] = 5;.
169a0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d    }.  while( i>=
169b0 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  1 ){.    a[i] = 
169c0 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b  11 - i;.    i--;
169d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
169e0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
169f0 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d  e ){.    a[pIdx-
16a00 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20  >nColumn] = 1;. 
16a10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
16a20 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
16a30 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
16a40 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
16a50 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
16a60 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
16a70 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
16a80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16a90 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
16aa0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
16ab0 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
16ac0 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
16ad0 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
16ae0 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
16af0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16b00 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
16b10 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
16b20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
16b30 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
16b40 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
16b50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
16b60 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
16b70 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
16b80 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
16b90 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
16ba0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16bb0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
16bc0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
16bd0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
16be0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
16bf0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
16c00 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
16c10 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
16c20 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
16c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16c40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
16c50 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
16c60 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
16c70 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
16c80 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
16c90 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
16ca0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
16cb0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
16cc0 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
16cd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16ce0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
16cf0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
16d00 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
16d10 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
16d20 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
16d30 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
16d40 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16d50 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
16d60 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
16d70 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
16d80 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
16d90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16da0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
16db0 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
16dc0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
16dd0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
16de0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
16df0 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
16e00 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
16e10 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
16e20 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
16e30 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
16e40 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
16e50 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
16e60 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
16e70 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
16e80 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
16e90 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
16ea0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
16eb0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
16ec0 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
16ed0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16ee0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
16ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
16f00 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
16f10 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
16f20 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
16f30 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
16f40 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
16f50 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
16f60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
16f70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
16f80 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
16f90 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
16fa0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
16fb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16fc0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
16fd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
16fe0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
16ff0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
17000 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
17010 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
17020 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
17030 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
17040 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
17050 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
17060 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
17070 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
17080 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a    pIndex->zName.
17090 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 73      );.    if( s
170a0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
170b0 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
170c0 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  1", db->aDb[iDb]
170d0 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
170e0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
170f0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
17100 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
17110 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31   %Q.sqlite_stat1
17120 20 57 48 45 52 45 20 69 64 78 3d 25 51 22 2c 0a   WHERE idx=%Q",.
17130 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
17140 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64  iDb].zName, pInd
17150 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ex->zName.      
17160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
17170 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
17180 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
17190 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
171a0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
171b0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
171c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
171d0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
171e0 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
171f0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
17200 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
17210 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
17220 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
17230 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
17240 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
17250 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
17260 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
17270 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  .  Each object i
17280 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
17290 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
172a0 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20 72  in size.  This r
172b0 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
172c0 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74   a new.** object
172d0 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74   on the end of t
172e0 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
172f0 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65 20  *pnEntry is the 
17300 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
17310 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65  s already in use
17320 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a  .  *pnAlloc is.*
17330 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  * the previously
17340 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   allocated size 
17350 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20 20 69  of the array.  i
17360 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a 2a  nitSize is the.*
17370 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e 69 74  * suggested init
17380 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20 61  ial array size a
17390 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  llocation..**.**
173a0 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
173b0 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 72  e new entry is r
173c0 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64 78  eturned in *pIdx
173d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
173e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 70  tine returns a p
173f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
17400 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
17410 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62   This.** might b
17420 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
17430 65 20 70 41 72 72 61 79 20 70 61 72 61 6d 65 74  e pArray paramet
17440 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  er or it might b
17450 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  e a different.**
17460 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65 20   pointer if the 
17470 61 72 72 61 79 20 77 61 73 20 72 65 73 69 7a 65  array was resize
17480 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
17490 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
174a0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
174b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
174c0 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
174d0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
174e0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
174f0 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
17500 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
17510 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
17520 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
17530 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
17540 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
17550 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
17560 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c  .  int initSize,
17570 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74 65       /* Suggeste
17580 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61  d initial alloca
17590 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
175a0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  s */.  int *pnEn
175b0 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
175c0 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
175d0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
175e0 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63  /.  int *pnAlloc
175f0 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ,     /* Current
17600 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
17610 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
17620 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
17630 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
17640 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
17650 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
17660 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
17670 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74 72  z;.  if( *pnEntr
17680 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b  y >= *pnAlloc ){
17690 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b  .    void *pNew;
176a0 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a 65  .    int newSize
176b0 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
176c0 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69  (*pnAlloc)*2 + i
176d0 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  nitSize;.    pNe
176e0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
176f0 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
17700 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79   newSize*szEntry
17710 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
17720 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
17730 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
17740 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
17750 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20   }.    *pnAlloc 
17760 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
17770 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 2f  cSize(db, pNew)/
17780 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20 70 41 72  szEntry;.    pAr
17790 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
177a0 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
177b0 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
177c0 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e  [*pnEntry * szEn
177d0 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79  try], 0, szEntry
177e0 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e  );.  *pIdx = *pn
177f0 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  Entry;.  ++*pnEn
17800 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
17810 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
17820 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
17830 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
17840 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
17850 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
17860 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
17870 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
17880 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
17890 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
178a0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
178b0 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
178c0 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a  Append(sqlite3 *
178d0 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
178e0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
178f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
17900 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
17910 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
17920 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
17930 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
17940 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
17950 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
17960 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
17970 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  oc = 0;.  }.  pL
17980 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
17990 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
179a0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
179b0 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
179c0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
179d0 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20  ]),.      5,.   
179e0 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
179f0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41        &pList->nA
17a00 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20  lloc,.      &i. 
17a10 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b   );.  if( i<0 ){
17a20 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
17a30 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
17a40 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
17a50 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
17a60 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
17a70 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17a80 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
17a90 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
17aa0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
17ab0 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
17ac0 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
17ad0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
17ae0 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
17af0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
17b00 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
17b10 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
17b20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
17b30 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
17b40 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
17b50 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
17b60 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
17b70 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
17b80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17b90 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
17ba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17bb0 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
17bc0 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
17bd0 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
17be0 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
17bf0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
17c00 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
17c10 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
17c20 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
17c30 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
17c40 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
17c50 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
17c60 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
17c70 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
17c80 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
17c90 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
17ca0 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
17cb0 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
17cc0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
17cd0 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73  .** Expand the s
17ce0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
17cf0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  or the given Src
17d00 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a  List object by.*
17d10 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72  * creating nExtr
17d20 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69  a new slots begi
17d30 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e  nning at iStart.
17d40 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f    iStart is zero
17d50 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73   based..** New s
17d60 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e  lots are zeroed.
17d70 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
17d80 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72  le, suppose a Sr
17d90 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  cList initially 
17da0 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74  contains two ent
17db0 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f  ries: A,B..** To
17dc0 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e   append 3 new en
17dd0 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65  tries onto the e
17de0 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a  nd, do this:.**.
17df0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  **    sqlite3Src
17e00 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
17e10 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b  pSrclist, 3, 2);
17e20 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
17e30 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77   call above it w
17e40 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41  ould contain:  A
17e50 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e  , B, nil, nil, n
17e60 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53  il..** If the iS
17e70 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61  tart argument ha
17e80 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64  d been 1 instead
17e90 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20   of 2, then the 
17ea0 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20  result.** would 
17eb0 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e  have been:  A, n
17ec0 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e  il, nil, nil, B.
17ed0 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65    To prepend the
17ee0 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74   new slots,.** t
17ef0 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20  he iStart value 
17f00 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65  would be 0.  The
17f10 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75   result then wou
17f20 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e  ld.** be: nil, n
17f30 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a  il, nil, A, B..*
17f40 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
17f50 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
17f60 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73  s the SrcList is
17f70 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65   unchanged.  The
17f80 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  .** db->mallocFa
17f90 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62  iled flag will b
17fa0 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a  e set to true..*
17fb0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
17fc0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
17fd0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
17fe0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17ff0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
18000 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65   notify of OOM e
18010 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69  rrors */.  SrcLi
18020 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  st *pSrc,     /*
18030 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20   The SrcList to 
18040 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
18050 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
18060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18070 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64   new slots to ad
18080 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a  d to pSrc->a[] *
18090 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20  /.  int iStart  
180a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
180b0 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  in pSrc->a[] of 
180c0 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a  first new slot *
180d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
180e0 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
180f0 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70  ing on calling p
18100 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
18110 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30  ssert( iStart>=0
18120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
18130 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 69 66 28  xtra>=1 );.  if(
18140 20 70 53 72 63 3d 3d 30 20 7c 7c 20 69 53 74 61   pSrc==0 || iSta
18150 72 74 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b  rt>pSrc->nSrc ){
18160 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
18170 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18180 0a 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63  .    return pSrc
18190 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
181a0 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
181b0 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
181c0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
181d0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
181e0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
181f0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
18200 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
18210 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
18220 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
18230 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
18240 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
18250 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
18260 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
18270 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
18280 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
18290 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
182a0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
182b0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
182c0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
182d0 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
182e0 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
182f0 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
18300 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
18310 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
18320 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
18330 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
18340 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
18350 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47  nAlloc = (u16)nG
18360 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
18370 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
18380 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
18390 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
183a0 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
183b0 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
183c0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
183d0 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
183e0 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
183f0 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
18400 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
18410 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
18420 20 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20   (i16)nExtra;.. 
18430 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
18440 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
18450 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
18460 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
18470 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
18480 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
18490 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
184a0 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
184b0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
184c0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
184d0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
184e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
184f0 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
18500 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
18510 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
18520 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
18530 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
18540 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
18550 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
18560 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
18570 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
18580 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
18590 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
185a0 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
185b0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
185c0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
185d0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
185e0 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
185f0 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
18600 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
18610 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
18620 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
18630 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
18640 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
18650 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
18660 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
18670 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
18680 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
18690 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
186a0 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
186b0 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
186c0 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
186d0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
186e0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
186f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
18700 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
18710 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
18720 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
18730 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
18740 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
18750 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
18760 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
18770 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
18780 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
18790 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
187a0 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
187b0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
187c0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
187d0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
187e0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
187f0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
18800 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
18810 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
18820 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
18830 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
18840 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
18850 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
18860 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
18870 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
18880 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
18890 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
188a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
188b0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
188c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
188d0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
188e0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
188f0 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
18900 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
18910 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
18920 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
18930 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
18940 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
18950 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
18960 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
18970 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
18980 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
18990 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
189a0 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
189b0 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
189c0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
189d0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
189e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
189f0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
18a00 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
18a10 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
18a20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
18a30 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
18a40 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
18a50 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
18a60 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
18a70 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
18a80 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
18a90 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
18aa0 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
18ab0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
18ac0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
18ad0 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
18ae0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18af0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
18b00 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
18b10 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
18b20 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  ro(db, sizeof(Sr
18b30 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
18b40 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
18b50 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
18b60 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
18b70 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
18b80 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
18b90 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
18ba0 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
18bb0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
18bc0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
18bd0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
18be0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
18bf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
18c00 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
18c10 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
18c20 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
18c30 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
18c40 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
18c50 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
18c60 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
18c70 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  && pTable ){.   
18c80 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
18c90 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
18ca0 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
18cb0 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
18cc0 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
18cd0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
18ce0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
18cf0 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
18d00 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
18d10 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18d20 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74  omToken(db, pDat
18d30 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  abase);.  return
18d40 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
18d50 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
18d60 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
18d70 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
18d80 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
18d90 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
18da0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
18db0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
18dc0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
18dd0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
18de0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
18df0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
18e00 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
18e10 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
18e20 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
18e30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
18e40 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
18e50 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
18e60 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
18e70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
18e80 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
18e90 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
18ea0 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
18eb0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
18ec0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
18ed0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
18ee0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
18ef0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
18f00 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
18f10 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
18f20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
18f30 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
18f40 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
18f50 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
18f60 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
18f70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
18f80 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
18f90 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
18fa0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
18fb0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
18fc0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
18fd0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
18fe0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
18ff0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
19000 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
19010 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
19020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
19030 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
19040 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
19050 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19060 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
19070 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19080 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
19090 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ias);.    sqlite
190a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
190b0 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
190c0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
190d0 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  le(pItem->pTab);
190e0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
190f0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
19100 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
19110 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
19120 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
19130 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
19140 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
19150 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
19160 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
19170 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
19180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19190 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
191a0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
191b0 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
191c0 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
191d0 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
191e0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
191f0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
19200 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
19210 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
19220 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
19230 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
19240 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
19250 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
19260 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
19270 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
19280 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
19290 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
192a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
192b0 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
192c0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
192d0 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
192e0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
192f0 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
19300 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
19310 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
19320 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
19330 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
19340 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e  as a alias, then
19350 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
19360 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
19370 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
19380 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
19390 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
193a0 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
193b0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
193c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
193d0 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
193e0 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
193f0 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
19400 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
19410 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
19420 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
19430 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
19440 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
19450 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
19460 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
19470 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
19480 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
19490 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
194a0 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
194b0 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
194c0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
194d0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
194e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
194f0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
19500 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
19510 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
19520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19530 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
19540 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19550 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
19560 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
19570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
19580 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
19590 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
195a0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
195b0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
195c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
195d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
195e0 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
195f0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
19600 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
19610 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
19620 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
19630 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
19640 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
19650 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
19660 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
19670 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
19680 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
19690 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
196a0 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
196b0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
196c0 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
196d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
196e0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
196f0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
19700 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19710 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
19720 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
19730 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71  se->db;.  p = sq
19740 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
19750 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65  nd(db, p, pTable
19760 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
19770 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  if( p==0 || p->n
19780 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Src==0 ){.    sq
19790 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
197a0 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 20 20 73 71  db, pOn);.    sq
197b0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
197c0 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
197d0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
197e0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
197f0 75 65 72 79 29 3b 0a 20 20 20 20 72 65 74 75 72  uery);.    retur
19800 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  n p;.  }.  pItem
19810 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
19820 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  -1];.  if( pAlia
19830 73 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29  s && pAlias->n )
19840 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
19850 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
19860 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
19870 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
19880 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
19890 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
198a0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
198b0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
198c0 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
198d0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
198e0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
198f0 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
19900 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
19910 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
19920 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
19930 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
19940 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
19950 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
19960 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
19970 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
19980 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
19990 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
199a0 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 69  pIndexedBy){.  i
199b0 66 28 20 70 49 6e 64 65 78 65 64 42 79 20 26 26  f( pIndexedBy &&
199c0 20 70 20 26 26 20 70 2d 3e 6e 53 72 63 3e 30 20   p && p->nSrc>0 
199d0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
199e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
199f0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
19a00 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  c-1];.    assert
19a10 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65  ( pItem->notInde
19a20 78 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d  xed==0 && pItem-
19a30 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20  >zIndex==0 );.  
19a40 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
19a50 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
19a60 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
19a70 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
19a80 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
19a90 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
19aa0 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
19ab0 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
19ac0 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
19ad0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
19ae0 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20  tem->notIndexed 
19af0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
19b00 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e        pItem->zIn
19b10 64 65 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  dex = sqlite3Nam
19b20 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
19b30 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42  e->db, pIndexedB
19b40 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  y);.    }.  }.}.
19b50 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
19b60 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
19b70 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
19b80 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
19b90 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
19ba0 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
19bb0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
19bc0 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
19bd0 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
19be0 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
19bf0 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
19c00 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
19c10 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
19c20 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
19c30 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
19c40 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
19c50 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
19c60 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
19c70 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
19c80 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
19c90 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
19ca0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
19cb0 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
19cc0 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
19cd0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
19ce0 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
19cf0 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
19d00 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
19d10 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
19d20 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
19d30 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
19d40 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
19d50 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
19d60 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
19d70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
19d80 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
19d90 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
19da0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
19db0 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
19dc0 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
19dd0 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61  .  if( p && p->a
19de0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
19df0 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
19e00 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
19e10 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69       p->a[i].joi
19e20 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
19e30 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ].jointype;.    
19e40 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f  }.    p->a[0].jo
19e50 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
19e60 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
19e70 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
19e80 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
19e90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
19ea0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
19eb0 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
19ec0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
19ed0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
19ee0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
19ef0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
19f00 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
19f10 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
19f20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
19f30 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
19f40 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
19f50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
19f60 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19f70 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
19f80 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
19f90 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
19fa0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
19fb0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
19fc0 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
19fd0 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
19fe0 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
19ff0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1a000 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1a010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a020 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
1a030 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
1a040 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
1a050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a060 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
1a070 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1a080 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a090 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
1a0a0 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
1a0b0 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
1a0c0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1a0d0 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
1a0e0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1a0f0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1a100 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1a110 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
1a120 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
1a130 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
1a140 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
1a150 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
1a160 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1a170 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1a180 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
1a190 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1a1a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1a1b0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
1a1c0 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
1a1d0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
1a1e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1a1f0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1a200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a210 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1a220 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
1a230 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
1a240 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1a250 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1a260 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
1a270 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1a280 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
1a290 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
1a2a0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
1a2b0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
1a2c0 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
1a2d0 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
1a2e0 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
1a2f0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
1a300 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1a310 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
1a320 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1a330 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1a340 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1a350 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
1a360 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
1a370 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1a380 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1a390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a3a0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1a3b0 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
1a3c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
1a3d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1a3e0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1a3f0 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
1a400 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
1a410 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
1a420 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
1a430 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
1a440 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
1a450 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
1a460 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
1a470 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
1a480 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
1a490 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a4a0 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1a4b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
1a4c0 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
1a4d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1a4e0 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
1a4f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a500 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1a510 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1a520 68 61 72 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22 42  har *az[] = { "B
1a530 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
1a540 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
1a550 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
1a560 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
1a570 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1a580 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
1a590 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
1a5a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1a5b0 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
1a5c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1a5d0 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
1a5e0 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
1a5f0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
1a600 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1a610 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1a620 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1a630 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1a640 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
1a650 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
1a660 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
1a670 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1a680 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1a690 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
1a6a0 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
1a6b0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
1a6c0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
1a6d0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1a6e0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
1a6f0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
1a700 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1a710 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1a720 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1a730 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1a740 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1a750 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1a760 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
1a770 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
1a780 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1a790 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 74 61   int rc;.    sta
1a7a0 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
1a7b0 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
1a7c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a7d0 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
1a7e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
1a7f0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1a800 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1a810 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
1a820 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1a830 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1a840 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a850 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
1a860 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a870 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
1a880 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45   0, 0, SQLITE_DE
1a890 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
1a8a0 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  , flags,.       
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61            &db->a
1a8d0 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
1a8e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a8f0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1a900 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a910 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
1a920 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
1a930 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
1a940 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
1a950 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
1a960 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
1a970 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
1a980 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a990 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a9a0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1a9b0 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
1a9c0 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
1a9d0 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
1a9e0 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
1a9f0 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
1aa00 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d  te3PagerJournalM
1aa10 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
1aa20 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d  Pager(db->aDb[1]
1aa30 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e     db->dfltJourn
1aa60 61 6c 4d 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72  alMode);.  }.  r
1aa70 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1aa80 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
1aa90 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76  code that will v
1aaa0 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
1aab0 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72   cookie and star
1aac0 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e  t.** a read-tran
1aad0 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20  saction for all 
1aae0 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  named database f
1aaf0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  iles..**.** It i
1ab00 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1ab10 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b   all schema cook
1ab20 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20  ies be verified 
1ab30 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20  and all.** read 
1ab40 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20  transactions be 
1ab50 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1ab60 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70  nything else hap
1ab70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56  pens in.** the V
1ab80 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75  DBE program.  Bu
1ab90 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  t this routine c
1aba0 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  an be called aft
1abb0 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a  er much other.**
1abc0 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67   code has been g
1abd0 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65  enerated.  So he
1abe0 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f  re is what we do
1abf0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  :.**.** The firs
1ac00 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
1ac10 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
1ac20 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74  e code an OP_Got
1ac30 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a  o that.** will j
1ac40 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74  ump to a subrout
1ac50 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ine at the end o
1ac60 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20  f the program.  
1ac70 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72  Then we.** recor
1ac80 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  d every database
1ac90 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20   that needs its 
1aca0 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20  schema verified 
1acb0 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65  in the.** pParse
1acc0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65  ->cookieMask fie
1acd0 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65  ld.  Later, afte
1ace0 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65  r all other code
1acf0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e   has been.** gen
1ad00 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72  erated, the subr
1ad10 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
1ad20 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
1ad30 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  fications and.**
1ad40 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e   starts the tran
1ad50 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65  sactions will be
1ad60 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f   coded and the O
1ad70 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a  P_Goto P2 value.
1ad80 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  ** will be made 
1ad90 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
1ada0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
1adb0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
1adc0 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65  the.** cookie ve
1add0 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f  rification subro
1ade0 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65  utine code happe
1adf0 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e  ns in sqlite3Fin
1ae00 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a  ishCoding()..**.
1ae10 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e  ** If iDb<0 then
1ae20 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74   code the OP_Got
1ae30 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73  o only - don't s
1ae40 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66  et flag to verif
1ae50 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  y the.** schema 
1ae60 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73  on any databases
1ae70 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
1ae80 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  sed to position 
1ae90 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65  the OP_Goto.** e
1aea0 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65  arly in the code
1aeb0 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77  , before we know
1aec0 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   if any database
1aed0 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20   tables will be 
1aee0 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
1aef0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1af00 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
1af10 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
1af20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1af30 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d  Vdbe *v;.  int m
1af40 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  ask;..  v = sqli
1af50 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1af60 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
1af70 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69   return;  /* Thi
1af80 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
1af90 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72  f there was a pr
1afa0 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64  ior error */.  d
1afb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1afc0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
1afd0 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20  okieGoto==0 ){. 
1afe0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1aff0 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  eGoto = sqlite3V
1b000 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b010 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
1b020 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
1b030 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
1b040 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1b050 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1b060 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
1b070 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
1b080 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
1b090 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
1b0a0 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31   );.    mask = 1
1b0b0 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
1b0c0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1b0d0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
1b0e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
1b0f0 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  ookieMask |= mas
1b100 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  k;.      pParse-
1b110 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
1b120 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
1b130 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1b140 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
1b150 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1b160 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
1b170 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1b180 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
1b190 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
1b1a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1b1b0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
1b1c0 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
1b1d0 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
1b1e0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
1b1f0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
1b200 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
1b210 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1b220 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
1b230 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
1b240 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
1b250 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
1b260 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
1b270 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
1b280 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
1b290 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
1b2a0 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
1b2b0 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
1b2c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
1b2d0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
1b2e0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
1b2f0 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
1b300 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
1b310 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
1b320 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
1b330 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
1b340 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
1b350 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
1b360 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
1b370 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
1b380 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
1b390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
1b3a0 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
1b3b0 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
1b3c0 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
1b3d0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
1b3e0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
1b3f0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
1b400 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
1b410 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
1b420 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
1b430 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1b440 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
1b450 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1b460 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1b470 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
1b480 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
1b490 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
1b4a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
1b4b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1b4c0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
1b4d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1b4e0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1b4f0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1b500 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74  ;.  pParse->writ
1b510 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b  eMask |= 1<<iDb;
1b520 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d  .  if( setStatem
1b530 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ent && pParse->n
1b540 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
1b550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b560 31 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e  1(v, OP_Statemen
1b570 74 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  t, iDb);.  }.}..
1b580 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
1b590 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
1b5a0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
1b5b0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1b5c0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
1b5d0 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
1b5e0 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
1b5f0 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
1b600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1b610 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
1b620 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
1b630 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
1b640 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
1b650 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1b660 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
1b670 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1b680 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1b690 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1b6a0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  [i];.    if( z==
1b6b0 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a  zColl || (z && z
1b6c0 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
1b6d0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
1b6e0 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ll)) ){.      re
1b6f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1b700 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1b710 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1b720 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1b730 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
1b740 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
1b750 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1b760 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
1b770 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
1b780 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1b790 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
1b7a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1b7b0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
1b7c0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
1b7d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
1b7e0 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
1b7f0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
1b800 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1b810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1b820 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1b830 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1b840 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
1b850 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
1b860 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
1b870 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
1b880 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
1b890 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
1b8a0 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
1b8b0 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
1b8c0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1b8d0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
1b8e0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
1b8f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
1b900 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1b910 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
1b920 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b930 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1b940 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1b950 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1b960 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1b970 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1b980 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
1b990 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
1b9a0 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
1b9b0 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
1b9c0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1b9d0 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
1b9e0 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
1b9f0 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
1ba00 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
1ba10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ba20 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1ba30 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
1ba40 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
1ba50 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
1ba60 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
1ba70 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
1ba80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1ba90 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1baa0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1bad0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
1bae0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1baf0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
1bb00 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1bb10 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
1bb20 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
1bb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1bb40 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
1bb50 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
1bb60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bb80 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
1bb90 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
1bba0 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
1bbb0 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
1bbc0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
1bbd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bbe0 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
1bbf0 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
1bc00 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
1bc10 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
1bc20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
1bc30 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
1bc40 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
1bc50 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
1bc60 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
1bc70 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
1bc80 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
1bc90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1bca0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1bcb0 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
1bcc0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
1bcd0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
1bd00 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
1bd10 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
1bd20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
1bd30 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1bd40 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
1bd50 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
1bd60 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1bd70 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
1bd80 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
1bd90 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
1bda0 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
1bdb0 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
1bdc0 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
1bdd0 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
1bde0 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
1bdf0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1be00 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
1be10 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
1be20 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
1be30 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
1be40 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
1be50 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
1be60 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
1be70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1be80 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
1be90 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1bea0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
1beb0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
1bec0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1bed0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
1bee0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
1bef0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1bf00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1bf10 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
1bf20 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
1bf30 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
1bf40 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf60 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
1bf70 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
1bf80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bfa0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1bfb0 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
1bfc0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
1bfd0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
1bfe0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bff0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
1c000 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1c010 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
1c020 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
1c030 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c050 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1c060 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
1c070 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1c080 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1c090 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1c0a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1c0b0 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
1c0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c0d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1c0e0 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
1c0f0 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
1c100 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
1c110 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
1c120 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c130 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1c140 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
1c150 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
1c160 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
1c170 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
1c180 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1c190 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1c1a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1c1b0 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
1c1c0 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a  ==0 || pName1->z
1c1d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
1c1e0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
1c1f0 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
1c200 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
1c210 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61  pName2==0 || pNa
1c220 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
1c230 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
1c240 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
1c250 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
1c260 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1c270 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1c280 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
1c290 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
1c2a0 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
1c2b0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
1c2c0 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
1c2d0 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b  , zColl, -1, 0);
1c2e0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1c2f0 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  {.      if( zCol
1c300 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 69  l ){.        rei
1c310 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
1c320 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
1c330 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1c340 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
1c350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1c360 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
1c370 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1c380 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zColl);.  }.  
1c390 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
1c3a0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
1c3b0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
1c3c0 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
1c3d0 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
1c3e0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
1c3f0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1c400 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
1c410 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
1c420 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
1c430 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
1c440 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
1c450 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
1c460 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
1c470 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
1c480 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1c490 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1c4a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
1c4b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c4c0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1c4d0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1c4e0 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
1c4f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1c500 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
1c510 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1c520 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1c530 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
1c540 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
1c550 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1c560 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
1c570 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
1c580 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c590 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1c5a0 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
1c5b0 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
1c5c0 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
1c5d0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
1c5e0 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f  a dynamicly allo
1c5f0 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74  cated KeyInfo st
1c600 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61 6e  ructure that can
1c610 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68   be used.** with
1c620 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20   OP_OpenRead or 
1c630 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20  OP_OpenWrite to 
1c640 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65 20  access database 
1c650 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
1c660 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1c670 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1c680 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65 20  e new structure 
1c690 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
1c6a0 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65  this case.** the
1c6b0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1c6c0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1c6d0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1c6e0 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72 65  (db, ) on the re
1c6f0 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74  turned .** point
1c700 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  er. If an error 
1c710 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d  occurs (out of m
1c720 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67  emory or missing
1c730 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73   collation .** s
1c740 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69  equence), NULL i
1c750 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1c760 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61 72  he state of pPar
1c770 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  se updated to re
1c780 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72  flect.** the err
1c790 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  or..*/.KeyInfo *
1c7a0 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
1c7b0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
1c7c0 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
1c7d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1c7e0 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
1c7f0 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74  lumn;.  int nByt
1c800 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49  es = sizeof(KeyI
1c810 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  nfo) + (nCol-1)*
1c820 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
1c830 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74   + nCol;.  sqlit
1c840 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c850 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
1c860 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20  pKey = (KeyInfo 
1c870 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1c880 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 73  cZero(db, nBytes
1c890 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  );..  if( pKey )
1c8a0 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d  {.    pKey->db =
1c8b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
1c8c0 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
1c8d0 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79  r = (u8 *)&(pKey
1c8e0 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a  ->aColl[nCol]);.
1c8f0 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65      assert( &pKe
1c900 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43  y->aSortOrder[nC
1c910 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b  ol]==&(((u8 *)pK
1c920 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a  ey)[nBytes]) );.
1c930 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1c940 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1c950 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1c960 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
1c970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
1c980 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  oll );.      pKe
1c990 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
1c9a0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
1c9b0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
1c9c0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65  , -1);.      pKe
1c9d0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
1c9e0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
1c9f0 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[i];.    }.  
1ca00 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d    pKey->nField =
1ca10 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a   (u16)nCol;.  }.
1ca20 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1ca30 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
1ca40 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65  e3DbFree(db, pKe
1ca50 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30  y);.    pKey = 0
1ca60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1ca70 4b 65 79 3b 0a 7d 0a                             Key;.}.