/ Hex Artifact Content
Login

Artifact ace6b5d99f724f102077ab6b0883ce1059c75271:


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 35 37 20 32 30 30 39 2f 30 37 2f 32 34  1.557 2009/07/24
02f0: 20 31 37 3a 35 38 3a 35 33 20 64 61 6e 69 65 6c   17:58:53 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 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
08e0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
08f0: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c  <pParse->nTableL
0900: 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ock; i++){.    p
0910: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0920: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0930: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
0940: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
0950: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
0960: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
0970: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
0980: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
0990: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
09a0: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
09b0: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
09c0: 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62   * (pParse->nTab
09d0: 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20 70 50 61  leLock+1);.  pPa
09e0: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  rse->aTableLock 
09f0: 3d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  = .      sqlite3
0a00: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
0a10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72  pParse->db, pPar
0a20: 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20  se->aTableLock, 
0a30: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70  nBytes);.  if( p
0a40: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a50: 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  k ){.    p = &pP
0a60: 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  arse->aTableLock
0a70: 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c  [pParse->nTableL
0a80: 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69  ock++];.    p->i
0a90: 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d  Db = iDb;.    p-
0aa0: 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  >iTab = iTab;.  
0ab0: 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b    p->isWriteLock
0ac0: 20 3d 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a   = isWriteLock;.
0ad0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a      p->zName = z
0ae0: 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
0af0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c     pParse->nTabl
0b00: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70  eLock = 0;.    p
0b10: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
0b20: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
0b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
0b40: 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69  n OP_TableLock i
0b50: 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 65  nstruction for e
0b60: 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64  ach table locked
0b70: 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   by the.** state
0b80: 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72 65 64  ment (configured
0b90: 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   by calls to sql
0ba0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29  ite3TableLock())
0bb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0bc0: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
0bd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
0be0: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20    int i;.  Vdbe 
0bf0: 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56 64 62  *pVdbe; ..  pVdb
0c00: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  e = sqlite3GetVd
0c10: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
0c20: 73 65 72 74 28 20 70 56 64 62 65 21 3d 30 20 29  sert( pVdbe!=0 )
0c30: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56  ; /* sqlite3GetV
0c40: 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a  dbe cannot fail:
0c50: 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 61 6c   VDBE already al
0c60: 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f  located */..  fo
0c70: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
0c80: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b  >nTableLock; i++
0c90: 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b  ){.    TableLock
0ca0: 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
0cb0: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0cc0: 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44    int p1 = p->iD
0cd0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  b;.    sqlite3Vd
0ce0: 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20  beAddOp4(pVdbe, 
0cf0: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31  OP_TableLock, p1
0d00: 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73  , p->iTab, p->is
0d10: 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  WriteLock,.     
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54   p->zName, P4_ST
0d40: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ATIC);.  }.}.#el
0d50: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64  se.  #define cod
0d60: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23  eTableLocks(x).#
0d70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
0d80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0d90: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0da0: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0db0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0dc0: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0dd0: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0de0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0df0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0e00: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
0e10: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
0e20: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
0e30: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
0e40: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
0e50: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
0e60: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
0e70: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0e80: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0e90: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0ea0: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0eb0: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0ec0: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0ed0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0ee0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0ef0: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0f00: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0f10: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
0f20: 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  v;..  db = pPars
0f30: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
0f40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
0f50: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f60: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f80: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
0f90: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  rn;..  /* Begin 
0fa0: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
0fb0: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
0fc0: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
0fd0: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
0fe0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 76  program.  */.  v
0ff0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1000: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1010: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1020: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1030: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
1040: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
1050: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
1060: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1070: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1080: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1090: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
10a0: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
10b0: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
10c0: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
10d0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
10e0: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
10f0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1100: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
1110: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
1120: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1130: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
1140: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1150: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
1160: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1170: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1180: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1190: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
11a0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
11b0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
11c0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11d0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
11e0: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
11f0: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
1200: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
1210: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
1220: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1230: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1240: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
1250: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1270: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
1280: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1290: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f  VdbeAddOp2(v,OP_
12a0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
12b0: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
12c0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
12d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
12e0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1300: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1310: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
1320: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1330: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
1340: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1350: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1360: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1370: 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BLE.      {.    
1380: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1390: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
13a0: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b  arse->nVtabLock;
13b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
13c0: 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63   char *vtab = (c
13d0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
13e0: 56 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  VTable(db, pPars
13f0: 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d  e->apVtabLock[i]
1400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1410: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1420: 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20  , OP_VBegin, 0, 
1430: 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 56  0, 0, vtab, P4_V
1440: 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TAB);.        }.
1450: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1460: 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20  nVtabLock = 0;. 
1470: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1480: 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c       /* Once all
1490: 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76   the cookies hav
14a0: 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  e been verified 
14b0: 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  and transactions
14c0: 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20   opened, .      
14d0: 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65  ** obtain the re
14e0: 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63  quired table-loc
14f0: 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  ks. This is a no
1500: 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a  -op unless the .
1510: 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d        ** shared-
1520: 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73  cache feature is
1530: 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20   enabled..      
1540: 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62  */.      codeTab
1550: 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b  leLocks(pParse);
1560: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
1570: 61 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e  alize any AUTOIN
1580: 43 52 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72  CREMENT data str
1590: 75 63 74 75 72 65 73 20 72 65 71 75 69 72 65 64  uctures required
15a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15b0: 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72   sqlite3Autoincr
15c0: 65 6d 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73  ementBegin(pPars
15d0: 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  e);..      /* Fi
15e0: 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b  nally, jump back
15f0: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1600: 67 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61  g of the executa
1610: 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  ble code. */.   
1620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1630: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1640: 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b   0, pParse->cook
1650: 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20  ieGoto);.    }. 
1660: 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   }...  /* Get th
1670: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72  e VDBE program r
1680: 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69  eady for executi
1690: 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20  on.  */.  if( v 
16a0: 26 26 20 41 4c 57 41 59 53 28 70 50 61 72 73 65  && ALWAYS(pParse
16b0: 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64  ->nErr==0) && !d
16c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16d0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
16e0: 5f 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20  _DEBUG.    FILE 
16f0: 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c  *trace = (db->fl
1700: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1710: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
1720: 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c  out : 0;.    sql
1730: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c  ite3VdbeTrace(v,
1740: 20 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a   trace);.#endif.
1750: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1760: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
1770: 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c  =0 );  /* Disabl
1780: 65 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65  es and re-enable
1790: 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 73  s match */.    s
17a0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
17b0: 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e  ady(v, pParse->n
17c0: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  Var, pParse->nMe
17d0: 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
17f0: 73 65 2d 3e 6e 54 61 62 2c 20 70 50 61 72 73 65  se->nTab, pParse
1800: 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  ->explain);.    
1810: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1820: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50  ITE_DONE;.    pP
1830: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
1840: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
1850: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
1860: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1870: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1880: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1890: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
18a0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
18b0: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
18c0: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
18d0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
18e0: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
18f0: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  ask = 0;.  pPars
1900: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
1910: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
1920: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63  the parser and c
1930: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65  ode generator re
1940: 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64  cursively in ord
1950: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a  er to generate.*
1960: 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  * code for the S
1970: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  QL statement giv
1980: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  en onto the end 
1990: 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f  of the pParse co
19a0: 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74  ntext.** current
19b0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
19c0: 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65  ction.  When the
19d0: 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72   parser is run r
19e0: 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68  ecursively.** th
19f0: 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61  is way, the fina
1a00: 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74  l OP_Halt is not
1a10: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74   appended and ot
1a20: 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  her initializati
1a30: 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69  on.** and finali
1a40: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65  zation steps are
1a50: 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65   omitted because
1a60: 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c   those are handl
1a70: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75  ing by the.** ou
1a80: 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a  termost parser..
1a90: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74  **.** Not everyt
1aa0: 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65  hing is nestable
1ab0: 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79  .  This facility
1ac0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
1ad0: 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54  permit.** INSERT
1ae0: 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45  , UPDATE, and DE
1af0: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
1b00: 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d  against SQLITE_M
1b10: 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63  ASTER.  Use.** c
1b20: 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64  are if you decid
1b30: 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20  e to try to use 
1b40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72  this routine for
1b50: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1b60: 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oses..*/.void sq
1b70: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1b80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
1ba0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
1bb0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
1bc0: 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
1bd0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71  ErrMsg = 0;.  sq
1be0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1bf0: 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65  se->db;.# define
1c00: 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f   SAVE_SZ  (sizeo
1c10: 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65  f(Parse) - offse
1c20: 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29  tof(Parse,nVar))
1c30: 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66 5b  .  char saveBuf[
1c40: 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28  SAVE_SZ];..  if(
1c50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
1c60: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
1c70: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
1c80: 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69  <10 );  /* Nesti
1c90: 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ng should only b
1ca0: 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70  e of limited dep
1cb0: 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74  th */.  va_start
1cc0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
1cd0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56   zSql = sqlite3V
1ce0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72  MPrintf(db, zFor
1cf0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1d00: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53  nd(ap);.  if( zS
1d10: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ql==0 ){.    ret
1d20: 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c  urn;   /* A mall
1d30: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1d40: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61  led */.  }.  pPa
1d50: 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20  rse->nested++;. 
1d60: 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c   memcpy(saveBuf,
1d70: 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20   &pParse->nVar, 
1d80: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  SAVE_SZ);.  mems
1d90: 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  et(&pParse->nVar
1da0: 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  , 0, SAVE_SZ);. 
1db0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
1dc0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
1dd0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
1de0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1df0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1e00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
1e10: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  l);.  memcpy(&pP
1e20: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65  arse->nVar, save
1e30: 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Buf, SAVE_SZ);. 
1e40: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d   pParse->nested-
1e50: 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  -;.}../*.** Loca
1e60: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1e70: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1e80: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
1e90: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
1ea0: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
1eb0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1ec0: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
1ed0: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
1ee0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1ef0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
1f00: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1f10: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1f20: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1f30: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1f40: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1f50: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20  earched for the 
1f60: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a  table and the.**
1f70: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1f80: 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65  table is returne
1f90: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1fa0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74   for duplicate t
1fb0: 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73  able.** names is
1fc0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1fd0: 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d  rch order is TEM
1fe0: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
1ff0: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  IN, then any.** 
2000: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2010: 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20  ses added using 
2020: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
2030: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  nd..**.** See al
2040: 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  so sqlite3Locate
2050: 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c  Table()..*/.Tabl
2060: 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61  e *sqlite3FindTa
2070: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
2080: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2090: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
20a0: 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61  zDatabase){.  Ta
20b0: 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  ble *p = 0;.  in
20c0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  t i;.  int nName
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d  ;.  assert( zNam
20e0: 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20  e!=0 );.  nName 
20f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2100: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  0(zName);.  for(
2110: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2120: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2130: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2140: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
2150: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2160: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2170: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
2180: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
2190: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
21a0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
21b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21c0: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
21d0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
21e0: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
21f0: 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  h, zName, nName)
2200: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
2210: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2220: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
2230: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
2240: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
2250: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
2260: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
2270: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
2280: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2290: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
22a0: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
22b0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
22c0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
22d0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
22e0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
22f0: 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76  ound.  Also leav
2300: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  e an.** error me
2310: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
2320: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
2330: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
2340: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
2350: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
2360: 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68  indTable() is th
2370: 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  at this.** routi
2380: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
2390: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
23a0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68  arse->zErrMsg wh
23b0: 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69  ere.** sqlite3Fi
23c0: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
23d0: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
23e0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
23f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2400: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  e,         /* co
2410: 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 74  ntext in which t
2420: 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20  o report errors 
2430: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
2440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2450: 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66  rue if looking f
2460: 6f 72 20 61 20 56 49 45 57 20 72 61 74 68 65 72  or a VIEW rather
2470: 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f   than a TABLE */
2480: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2490: 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  Name,     /* Nam
24a0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  e of the table w
24b0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
24c0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
24d0: 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a  r *zDbase     /*
24e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
24f0: 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65  abase.  Might be
2500: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61   NULL */.){.  Ta
2510: 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65  ble *p;..  /* Re
2520: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
2530: 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
2540: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
2550: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
2560: 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
2570: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
2580: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
2590: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
25a0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
25b0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
25c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
25d0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
25e0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
25f0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
2600: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2610: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2620: 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f  *zMsg = isView ?
2630: 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20   "no such view" 
2640: 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  : "no such table
2650: 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  ";.    if( zDbas
2660: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2670: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2680: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20  e, "%s: %s.%s", 
2690: 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  zMsg, zDbase, zN
26a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
26b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
26c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
26d0: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
26e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
26f0: 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
2700: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  hema = 1;.  }.  
2710: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2720: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2730: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2740: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2750: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
2760: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
2770: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
2780: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
2790: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
27a0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
27b0: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
27c0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
27d0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
27e0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
27f0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
2800: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
2810: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
2820: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
2830: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
2840: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
2850: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
2860: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
2870: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
2880: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
2890: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
28a0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
28b0: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
28c0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
28d0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
28e0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
28f0: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
2900: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
2910: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2920: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2930: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
2940: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
2950: 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20   i;.  int nName 
2960: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2970: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  0(zName);.  for(
2980: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2990: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
29a0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
29b0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
29c0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
29d0: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
29e0: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
29f0: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  = db->aDb[j].pSc
2a00: 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
2a10: 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ( pSchema );.   
2a20: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
2a30: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
2a40: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2a50: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2a60: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2a70: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
2a80: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2a90: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
2aa0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
2ab0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2ac0: 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20  .** Reclaim the 
2ad0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
2ae0: 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69  n index.*/.stati
2af0: 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78  c void freeIndex
2b00: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71  (Index *p){.  sq
2b10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70  lite3 *db = p->p
2b20: 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20 20  Table->dbMem;.  
2b30: 2f 2a 20 74 65 73 74 63 61 73 65 28 20 64 62 3d  /* testcase( db=
2b40: 3d 30 20 29 3b 20 2a 2f 0a 20 20 73 71 6c 69 74  =0 ); */.  sqlit
2b50: 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d  e3DeleteIndexSam
2b60: 70 6c 65 73 28 70 29 3b 0a 20 20 73 71 6c 69 74  ples(p);.  sqlit
2b70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
2b80: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
2b90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
2ba0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
2bb0: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
2bc0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
2bd0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
2be0: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
2bf0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
2c00: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
2c10: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
2c20: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2c30: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
2c40: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
2c50: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
2c60: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
2c70: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
2c80: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
2c90: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
2ca0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2cb0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2cc0: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
2cd0: 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29  eIndex(Index *p)
2ce0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
2cf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d00: 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b  Name = p->zName;
2d10: 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ..  pOld = sqlit
2d20: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
2d30: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
2d40: 68 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  h, zName,.      
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
2d70: 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 29 3b  en30(zName), 0);
2d80: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d  .  assert( pOld=
2d90: 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b  =0 || pOld==p );
2da0: 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b  .  freeIndex(p);
2db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  .}../*.** For th
2dc0: 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a  e index called z
2dd0: 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73  IdxName which is
2de0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
2df0: 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75  tabase iDb,.** u
2e00: 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78  nlike that index
2e10: 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20   from its Table 
2e20: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20  then remove the 
2e30: 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68  index from.** th
2e40: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
2e50: 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  le and free all 
2e60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2e70: 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
2e80: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a  with the index..
2e90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
2ea0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
2eb0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
2ec0: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
2ed0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b  char *zIdxName){
2ee0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2ef0: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48  ;.  int len;.  H
2f00: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62  ash *pHash = &db
2f10: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
2f20: 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20  ma->idxHash;..  
2f30: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  len = sqlite3Str
2f40: 6c 65 6e 33 30 28 7a 49 64 78 4e 61 6d 65 29 3b  len30(zIdxName);
2f50: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2f60: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2f70: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2f80: 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  en, 0);.  if( pI
2f90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2fa0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2fb0: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2fc0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2fd0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2fe0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2ff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3000: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
3010: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3020: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3030: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3040: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3050: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3060: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3070: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3080: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3090: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
30a0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
30b0: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
30c0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
30d0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
30e0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
30f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
3100: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3110: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3120: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
3130: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
3140: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
3150: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
3170: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
3180: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
3190: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
31a0: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
31b0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
31c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
31d0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
31e0: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
31f0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
3200: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
3210: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
3220: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
3230: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
3240: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
3250: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
3260: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
3270: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
3280: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
3290: 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 20 74 68  .** If iDb==0 th
32a0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
32b0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
32c0: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
32d0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
32e0: 49 66 20 69 44 62 3e 3d 31 20 74 68 65 6e 20 72  If iDb>=1 then r
32f0: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
3300: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
3310: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
3320: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
3330: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3340: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
3350: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
3360: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
3370: 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  i, j;.  assert( 
3380: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
3390: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  ->nDb );..  if( 
33a0: 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  iDb==0 ){.    sq
33b0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
33c0: 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f  ll(db);.  }.  fo
33d0: 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e  r(i=iDb; i<db->n
33e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
33f0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3400: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3410: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3420: 20 20 20 61 73 73 65 72 74 28 69 3d 3d 31 20 7c     assert(i==1 |
3430: 7c 20 28 70 44 62 2d 3e 70 42 74 20 26 26 20 73  | (pDb->pBt && s
3440: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3450: 4d 75 74 65 78 28 70 44 62 2d 3e 70 42 74 29 29  Mutex(pDb->pBt))
3460: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3470: 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e  SchemaFree(pDb->
3480: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
3490: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
34a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
34b0: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
34c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
34d0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
34e0: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
34f0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
3500: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
3510: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
3520: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
3530: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
3540: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
3550: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
3560: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
3570: 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
3580: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
3590: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
35a0: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
35b0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
35c0: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
35d0: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
35e0: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
35f0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
3600: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
3610: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
3620: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
3630: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
3640: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
3650: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
3660: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
3670: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3680: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
3690: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
36a0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
36b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
36c0: 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61  ree(db, pDb->zNa
36d0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
36e0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
36f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
3700: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
3710: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
3720: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
3730: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
3740: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
3750: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
3760: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
3770: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
3780: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
3790: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
37a0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
37b0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
37c0: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
37d0: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
37e0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
37f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
3800: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
3810: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
3820: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
3830: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
3840: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3850: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
3860: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
3870: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
3880: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
3890: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
38a0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
38b0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
38c0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  s;.}../*.** Clea
38d0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
38e0: 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  es from a table 
38f0: 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74  or view..*/.stat
3900: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65  ic void sqliteRe
3910: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54  setColumnNames(T
3920: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
3930: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
3940: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
3950: 33 20 2a 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e  3 *db = pTable->
3960: 64 62 4d 65 6d 3b 0a 20 20 74 65 73 74 63 61 73  dbMem;.  testcas
3970: 65 28 20 64 62 3d 3d 30 20 29 3b 0a 20 20 61 73  e( db==0 );.  as
3980: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3990: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
39a0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
39b0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
39c0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
39d0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
39e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
39f0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3a00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3a10: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3a20: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3a40: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3a50: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3a60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3a70: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3a80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3a90: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3aa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3ab0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3ac0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3ad0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3ae0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3af0: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3b00: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3b10: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3b20: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3b30: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3b40: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3b50: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3b60: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3b70: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3b80: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3b90: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3ba0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3bb0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3bc0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3bd0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3be0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3bf0: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
3c00: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
3c10: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
3c20: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
3c30: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
3c40: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
3c50: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
3c60: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3c70: 6c 65 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  le(Table *pTable
3c80: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
3c90: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b  ex, *pNext;.  FK
3ca0: 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78  ey *pFKey, *pNex
3cb0: 74 46 4b 65 79 3b 0a 20 20 73 71 6c 69 74 65 33  tFKey;.  sqlite3
3cc0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 54 61   *db;..  if( pTa
3cd0: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
3ce0: 0a 20 20 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e  .  db = pTable->
3cf0: 64 62 4d 65 6d 3b 0a 20 20 74 65 73 74 63 61 73  dbMem;.  testcas
3d00: 65 28 20 64 62 3d 3d 30 20 29 3b 0a 0a 20 20 2f  e( db==0 );..  /
3d10: 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  * Do not delete 
3d20: 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20  the table until 
3d30: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
3d40: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
3d50: 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  . */.  pTable->n
3d60: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61  Ref--;.  if( pTa
3d70: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  ble->nRef>0 ){. 
3d80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3d90: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
3da0: 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
3db0: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
3dc0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
3dd0: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
3de0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
3df0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
3e00: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
3e10: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
3e20: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e30: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
3e40: 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  ( pIndex->pSchem
3e50: 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  a==pTable->pSche
3e60: 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
3e70: 33 44 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e  3DeleteIndex(pIn
3e80: 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  dex);.  }..#ifnd
3e90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
3ea0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20  OREIGN_KEY.  /* 
3eb0: 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69  Delete all forei
3ec0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
3ed0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
3ee0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b  le. */.  for(pFK
3ef0: 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79  ey=pTable->pFKey
3f00: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
3f10: 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70  NextFKey){.    p
3f20: 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79  NextFKey = pFKey
3f30: 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20  ->pNextFrom;.   
3f40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3f50: 62 2c 20 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23  b, pFKey);.  }.#
3f60: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65  endif..  /* Dele
3f70: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
3f80: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
3f90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65   */.  sqliteRese
3fa0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
3fb0: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ble);.  sqlite3D
3fc0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
3fd0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
3fe0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3ff0: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
4000: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
4010: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
4020: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e  ->pSelect);.#ifn
4030: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4040: 43 48 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45  CHECK.  sqlite3E
4050: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54  xprDelete(db, pT
4060: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
4070: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
4080: 74 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29  tabClear(pTable)
4090: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
40a0: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d  e(db, pTable);.}
40b0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
40c0: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
40d0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
40e0: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
40f0: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
4100: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61  structure with a
4110: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
4120: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e  nd foreign keys.
4130: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4140: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
4150: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4160: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
4170: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29   char *zTabName)
4180: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4190: 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
41a0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
41b0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
41c0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
41d0: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61    assert( zTabNa
41e0: 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30  me && zTabName[0
41f0: 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  ] );.  pDb = &db
4200: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
4210: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
4220: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
4230: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
4240: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4260: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
4270: 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71  abName),0);.  sq
4280: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4290: 28 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  (p);.  db->flags
42a0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
42b0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
42c0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
42d0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
42e0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
42f0: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
4300: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53  hat.** token.  S
4310: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
4320: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
4330: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
4340: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
4350: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
4360: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
4370: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
4380: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74  ..**.** Any quot
4390: 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a  ation marks (ex:
43a0: 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27    "name", 'name'
43b0: 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61  , [name], or `na
43c0: 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72  me`) that.** sur
43d0: 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f  round the body o
43e0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20  f the token are 
43f0: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
4400: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
4410: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
4420: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
4430: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
4440: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
4450: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
4460: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
4470: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
4480: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
4490: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
44a0: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
44b0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
44c0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73  3NameFromToken(s
44d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
44e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
44f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
4500: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
4510: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
4520: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
4530: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
4540: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
4550: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
4560: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
4570: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
4580: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
4590: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
45a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
45b0: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
45c0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
45d0: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
45e0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
45f0: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
4600: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
4610: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
4620: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
4630: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
4640: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4650: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
4660: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
4670: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
4680: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4690: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
46a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
46b0: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
46c0: 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b  STER_ROOT, iDb);
46d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
46e0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
46f0: 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e 54 33  har *)5, P4_INT3
4700: 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75 6d 6e  2);  /* 5 column
4710: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
4720: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
4730: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
4740: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
4750: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
4760: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
4770: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
4780: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
4790: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
47a0: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
47b0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
47c0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
47d0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
47e0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
47f0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
4800: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4810: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
4820: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
4830: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
4840: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
4850: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
4860: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
4870: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4880: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
4890: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
48a0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
48b0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
48c0: 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20  *pDb;.    int n 
48d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
48e0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
48f0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
4900: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
4910: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
4920: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
4930: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4940: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c  i!=1 ) && n==sql
4950: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
4960: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
4970: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
4980: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
4990: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
49a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
49b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
49c0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
49d0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
49e0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
49f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
4a00: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4a10: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4a20: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4a30: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4a40: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4a50: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4a60: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4a70: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4a80: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4a90: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4aa0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
4ab0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4ac0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
4ad0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
4ae0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4b10: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4b20: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
4b50: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
4b60: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
4b70: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
4b80: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
4b90: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
4ba0: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
4bb0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4bc0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
4bd0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
4be0: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
4bf0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
4c00: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
4c10: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
4c20: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
4c30: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
4c40: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
4c50: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
4c60: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
4c70: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
4c80: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
4c90: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
4ca0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4cb0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
4cc0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
4cd0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
4ce0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
4cf0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
4d00: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
4d10: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4d20: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
4d30: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4d40: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
4d50: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
4d60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4d70: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
4d80: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
4d90: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
4da0: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
4db0: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
4dc0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
4dd0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
4de0: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
4df0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
4e00: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
4e10: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
4e20: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
4e30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4e40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
4e50: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
4e60: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
4e70: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
4e80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
4e90: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
4ea0: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
4eb0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
4ec0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
4ed0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
4ee0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
4ef0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
4f00: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
4f10: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
4f20: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
4f30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
4f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4f50: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4f60: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
4f70: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
4f80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4f90: 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  b;..  if( ALWAYS
4fa0: 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70  (pName2!=0) && p
4fb0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20  Name2->n>0 ){.  
4fc0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
4fd0: 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71  usy ) {.      sq
4fe0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4ff0: 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64  arse, "corrupt d
5000: 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20  atabase");.     
5010: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5020: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
5030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
5040: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
5050: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
5060: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
5070: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
5080: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5090: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
50a0: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
50b0: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
50c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
50d0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
50e0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
50f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5100: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
5110: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
5120: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
5130: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
5140: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
5150: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
5160: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
5170: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5180: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
5190: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
51a0: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
51b0: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
51c0: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
51d0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
51e0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
51f0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
5200: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
5210: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
5220: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
5230: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
5240: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
5250: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
5260: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
5270: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
5280: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
5290: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
52a0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
52b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
52c0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
52d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
52e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
52f0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
5300: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
5310: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
5320: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
5330: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
5340: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
5350: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
5360: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
5370: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
5380: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
5390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
53a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
53b0: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
53c0: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
53d0: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
53e0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
53f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5400: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5410: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  E_OK;.}../*.** B
5420: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
5430: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
5440: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
5450: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
5460: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
5470: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
5480: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
5490: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
54a0: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
54b0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
54c0: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
54d0: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
54e0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
54f0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
5500: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
5510: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
5520: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5530: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
5540: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
5550: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
5560: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
5570: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
5580: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
5590: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
55a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
55b0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
55c0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
55d0: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
55e0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
55f0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
5600: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
5610: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
5620: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
5630: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
5640: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
5650: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
5660: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
5670: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
5680: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
5690: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
56a0: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
56b0: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
56c0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
56d0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
56e0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
56f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
5700: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5710: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
5720: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
5730: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
5740: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
5750: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
5760: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5770: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
5780: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
5790: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
57a0: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
57b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
57c0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
57d0: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
57e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
57f0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
5800: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
5810: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
5820: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5830: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5840: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
5850: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
5860: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
5870: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
5880: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
5890: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
58a0: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
58b0: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
58c0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
58d0: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
58e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
58f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
5900: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
5910: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
5920: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
5930: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
5940: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5950: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5960: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5970: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5980: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5990: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
59a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
59b0: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
59c0: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
59d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
59e0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
59f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5a00: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
5a10: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
5a20: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
5a30: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
5a40: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5a50: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5a60: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5a70: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5a80: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5a90: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5aa0: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
5ab0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5ac0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
5ad0: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
5ae0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5af0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5b00: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5b10: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
5b20: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5b30: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5b40: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5b50: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5b60: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5b70: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5b80: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5b90: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5ba0: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5bb0: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5bc0: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5bd0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5be0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5bf0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
5c00: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5c10: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5c20: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5c30: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5c40: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5c50: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5c60: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5c70: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5c80: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5c90: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5ca0: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5cb0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5cc0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5cd0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5ce0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5cf0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5d00: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5d10: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5d20: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5d30: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5d40: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5d50: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5d60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5d70: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5d80: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5d90: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5da0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5db0: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5dc0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5dd0: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5de0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5df0: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5e00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5e10: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5e20: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
5e30: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5e40: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
5e50: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5e60: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
5e70: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
5e80: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5e90: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
5ea0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
5eb0: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
5ec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5ed0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
5ee0: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
5ef0: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
5f00: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
5f10: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
5f20: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
5f30: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
5f40: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
5f50: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
5f60: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
5f70: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
5f80: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
5f90: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5fa0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
5fb0: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
5fc0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
5fd0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5fe0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5ff0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6000: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
6010: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
6020: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6030: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
6040: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
6050: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
6060: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
6070: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6080: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6090: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
60a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
60b0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
60c0: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
60d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
60e0: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
60f0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
6100: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
6110: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
6120: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6130: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6140: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
6150: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
6160: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
6170: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
6180: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
6190: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
61a0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
61b0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
61c0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
61d0: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
61e0: 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20  ** it does. The 
61f0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
6200: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65  the statement be
6210: 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70  ing parsed was p
6220: 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e  assed.  ** to an
6230: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
6240: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e  _vtab() call. In
6250: 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
6260: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
6270: 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20  .  ** and types 
6280: 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f  will be used, so
6290: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
62a0: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61  d to test for na
62b0: 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c  mespace.  ** col
62c0: 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  lisions..  */.  
62d0: 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f  if( !IN_DECLARE_
62e0: 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20  VTAB ){.    if( 
62f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6300: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
6310: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
6320: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6330: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6340: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
6350: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
6360: 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
6370: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
6380: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6390: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
63a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
63b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
63c0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
63d0: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
63e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
63f0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6400: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6410: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
6420: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
6430: 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62  e, 0)!=0 && (iDb
6440: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
6450: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20  .busy) ){.      
6460: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6470: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
6480: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
6490: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
64a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
64b0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
64c0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
64d0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
64e0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
64f0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
6500: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
6510: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
6520: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
6530: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
6540: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6550: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6560: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
6570: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6580: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
6590: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
65a0: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
65b0: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
65c0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
65d0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
65e0: 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ble->nRef = 1;. 
65f0: 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 20 3d   pTable->dbMem =
6600: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
6610: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
6620: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
6630: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
6640: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
6650: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
6660: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
6670: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
6680: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
6690: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
66a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
66b0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
66c0: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
66d0: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
66e0: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
66f0: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
6700: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
6710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6720: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
6730: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
6740: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
6750: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
6760: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  e")==0 ){.    pT
6770: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
6780: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
6790: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
67a0: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
67b0: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
67c0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
67d0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
67e0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
67f0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
6800: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
6810: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
6820: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
6830: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
6840: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
6850: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
6860: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
6870: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
6880: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
6890: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
68a0: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
68b0: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
68c0: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
68d0: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
68e0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
68f0: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
6900: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
6910: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
6920: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6930: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
6940: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
6950: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
6960: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
6970: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
6980: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
6990: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
69a0: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
69b0: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
69c0: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
69d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
69e0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
69f0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
6a00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6a10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6a20: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
6a30: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
6a40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
6a50: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
6a60: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
6a70: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
6a80: 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64  format and encod
6a90: 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62  ing in the datab
6aa0: 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  ase have not bee
6ab0: 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73  n set, .    ** s
6ac0: 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20  et them now..   
6ad0: 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70   */.    reg1 = p
6ae0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20  Parse->regRowid 
6af0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6b00: 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61  ;.    reg2 = pPa
6b10: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b  rse->regRoot = +
6b20: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6b30: 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72     reg3 = ++pPar
6b40: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
6b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6b60: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
6b70: 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52  , iDb, reg3, BTR
6b80: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b  EE_FILE_FORMAT);
6b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ba0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
6bb0: 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6bd0: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20   OP_If, reg3);. 
6be0: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
6bf0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
6c00: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
6c10: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
6c20: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
6c30: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
6c40: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
6c50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6c60: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
6c70: 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20  ormat, reg3);.  
6c80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c90: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
6ca0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
6cb0: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67  FILE_FORMAT, reg
6cc0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6cd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6ce0: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
6cf0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
6d00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6d10: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6d20: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
6d30: 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b  ENCODING, reg3);
6d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6d50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
6d60: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6d70: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6d80: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6d90: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6da0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6db0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6dc0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6dd0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6de0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6df0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6e00: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
6e10: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
6e20: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6e30: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6e40: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6e50: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6e60: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
6e70: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
6e80: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
6e90: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
6ea0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
6eb0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
6ec0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
6ed0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
6ee0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
6ef0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
6f00: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
6f10: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
6f20: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
6f30: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
6f40: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
6f50: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6f60: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
6f70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6f80: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6f90: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
6fa0: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
6fb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6fc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6fd0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
6fe0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
6ff0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
7000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7010: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
7020: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
7030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7040: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
7050: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
7060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7070: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7080: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
7090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
70a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
70b0: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
70c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
70d0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
70e0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
70f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7100: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7110: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7130: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
7140: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
7150: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
7160: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
7170: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
7180: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
7190: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
71a0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
71b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
71c0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
71d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
71e0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
71f0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
7200: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
7210: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
7220: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
7230: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
7240: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
7250: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
7260: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
7270: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
7280: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
7290: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
72a0: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
72b0: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
72c0: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
72d0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
72e0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
72f0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
7300: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
7310: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
7320: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
7330: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7340: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
7350: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
7360: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7370: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7380: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
7390: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
73a0: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
73b0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
73c0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
73d0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
73e0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
73f0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
7400: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7410: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
7420: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
7430: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
7440: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7450: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
7460: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
7470: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
7480: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
7490: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
74a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
74b0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
74c0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
74d0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
74e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
74f0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
7500: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7510: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
7520: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
7530: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7540: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
7550: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7560: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7570: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
7580: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
7590: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
75a0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
75b0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
75c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
75d0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
75e0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
75f0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
7600: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7610: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
7620: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7630: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7640: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7660: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7670: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7680: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7690: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
76a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
76b0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
76c0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
76d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
76e0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
76f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7700: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
7710: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
7720: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
7730: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
7740: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7750: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
7760: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
7770: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
7780: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
77a0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
77b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
77c0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
77d0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
77e0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
77f0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
7800: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
7810: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
7820: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
7830: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7840: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
7850: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
7860: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
7870: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
7880: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
7890: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
78a0: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
78b0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
78c0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
78d0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
78e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
78f0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
7900: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
7910: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
7920: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
7930: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7940: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7950: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7960: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7970: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7980: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7990: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
79a0: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
79b0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
79c0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
79d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
79e0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
79f0: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
7a00: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
7a10: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7a20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7a30: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
7a40: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
7a50: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
7a60: 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  *p;.  p = pParse
7a70: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
7a80: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
7a90: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
7aa0: 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b  turn;.  p->aCol[
7ab0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75  p->nCol-1].notNu
7ac0: 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  ll = (u8)onError
7ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
7ae0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
7af0: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
7b00: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
7b10: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
7b20: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
7b30: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
7b40: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
7b50: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
7b60: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
7b70: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
7b80: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
7b90: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
7ba0: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
7bb0: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
7bc0: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
7bd0: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
7be0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
7bf0: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
7c00: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
7c10: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7c20: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
7c30: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
7c40: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
7c50: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
7c60: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
7c70: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
7c80: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
7c90: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
7ca0: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
7cb0: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
7cc0: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
7cf0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7d00: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
7d10: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
7d20: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7d30: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
7d40: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7d50: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
7d60: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7d70: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
7d80: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7d90: 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c  FF_NONE.** 'REAL
7da0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7db0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
7dc0: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
7dd0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7de0: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
7df0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
7e10: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7e20: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
7e30: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
7e40: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
7e50: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
7e60: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
7e70: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
7e80: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a  nst char *zIn){.
7e90: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
7ea0: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
7eb0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20  _AFF_NUMERIC;.. 
7ec0: 20 69 66 28 20 7a 49 6e 20 29 20 77 68 69 6c 65   if( zIn ) while
7ed0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
7ee0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
7ef0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7f00: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
7f10: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
7f20: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
7f30: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
7f40: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
7f50: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
7f60: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7f70: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a  LITE_AFF_TEXT; .
7f80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7f90: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
7fa0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
7fb0: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
7fc0: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
7fd0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7fe0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
7ff0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
8000: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
8010: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
8020: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
8030: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8040: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8050: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
8060: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8070: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
8080: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
8090: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
80a0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
80b0: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
80c0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
80d0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
80e0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23  LITE_AFF_NONE;.#
80f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8100: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
8110: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
8120: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
8130: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
8140: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
8150: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
8160: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8170: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8180: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8190: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
81a0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
81b0: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
81c0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
81d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
81e0: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
81f0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8200: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8210: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8220: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8230: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
8240: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
8250: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
8260: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
8270: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8280: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8290: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
82a0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
82b0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
82c0: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
82d0: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
82e0: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
82f0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
8300: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8310: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
8320: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8330: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
8340: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
8350: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8360: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8370: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8380: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8390: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
83a0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
83b0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
83c0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
83d0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
83e0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
83f0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
8400: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
8410: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
8420: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8430: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
8440: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
8450: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
8460: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
8470: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
8480: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
8490: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
84a0: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
84b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
84c0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
84d0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
84e0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
84f0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
8500: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8510: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8520: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
8530: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d  mn *pCol;..  p =
8540: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8550: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
8560: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
8570: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
8580: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
8590: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73  ->nCol-1];.  ass
85a0: 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  ert( pCol->zType
85b0: 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  ==0 );.  pCol->z
85c0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
85d0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
85e0: 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a  se->db, pType);.
85f0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8600: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
8610: 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79  tyType(pCol->zTy
8620: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
8630: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8640: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
8650: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
8660: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8670: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
8680: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8690: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
86a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
86b0: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
86c0: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
86d0: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
86e0: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
86f0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
8700: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
8710: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8720: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8730: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8740: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8750: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8760: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8770: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
8780: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8790: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53 70   *pParse, ExprSp
87a0: 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61  an *pSpan){.  Ta
87b0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
87c0: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
87d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
87e0: 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  db;.  p = pParse
87f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
8800: 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70  f( p!=0 ){.    p
8810: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
8820: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
8830: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
8840: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
8850: 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78  ction(pSpan->pEx
8860: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
8870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8880: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
8890: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
88a0: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
88b0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
88c0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
88d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
88e0: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
88f0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
8900: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
8910: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
8920: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
8930: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
8940: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
8950: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
8960: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
8970: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
8980: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
8990: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
89a0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
89b0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
89c0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
89d0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
89e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
89f0: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
8a00: 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  r, EXPRDUP_REDUC
8a10: 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
8a20: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
8a30: 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->zDflt);.      
8a40: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71  pCol->zDflt = sq
8a50: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
8a60: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
8a70: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
8aa0: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
8ab0: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
8ac0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
8ad0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8ae0: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
8af0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
8b00: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
8b10: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
8b20: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
8b30: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
8b40: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
8b50: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
8b60: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
8b70: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
8b80: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
8b90: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8ba0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
8bb0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
8bc0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
8bd0: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
8be0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
8bf0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
8c00: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
8c10: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
8c20: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
8c30: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
8c40: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
8c50: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
8c60: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
8c70: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
8c80: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
8c90: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
8ca0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
8cb0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
8cc0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
8cd0: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
8ce0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
8cf0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
8d00: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
8d10: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
8d20: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8d30: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
8d40: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
8d50: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
8d60: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
8d70: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
8d80: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8d90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
8da0: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
8db0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8dc0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8dd0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
8de0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
8df0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
8e00: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
8e10: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
8e20: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
8e30: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
8e40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8e50: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8e60: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8e70: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
8e80: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
8e90: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
8ea0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8eb0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8ec0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8ed0: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8ee0: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8ef0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8f00: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
8f10: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
8f20: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
8f30: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
8f40: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
8f50: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
8f60: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
8f70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
8f80: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
8f90: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
8fa0: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
8fb0: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
8fc0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
8fd0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
8fe0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
8ff0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
9000: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
9010: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9020: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
9030: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
9040: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
9050: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
9060: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
9070: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
9080: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
9090: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
90a0: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
90b0: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
90c0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
90d0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
90e0: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
90f0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
9100: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
9110: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9120: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
9130: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
9140: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
9150: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
9160: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9170: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
9180: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9190: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
91a0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
91b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
91c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
91d0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
91e0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
91f0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
9200: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
9210: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
9220: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
9230: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
9240: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
9250: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
9260: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9270: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
9280: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
9290: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
92a0: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
92b0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
92c0: 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  GER")==0.       
92d0: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53   && sortOrder==S
92e0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
92f0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
9300: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
9310: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
9320: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
9330: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
9340: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
9350: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
9360: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
9370: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
9380: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
9390: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
93a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
93b0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
93c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
93d0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
93e0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
93f0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
9400: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
9410: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
9420: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
9430: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
9440: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9450: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
9460: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
9470: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
9480: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
9490: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
94a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
94b0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
94c0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
94d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
94e0: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
94f0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
9500: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
9510: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9520: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
9530: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
9540: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
9550: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
9560: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9570: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
9580: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
9590: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
95a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
95b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
95c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
95d0: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
95e0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
95f0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
9600: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
9610: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
9620: 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d    pTab->pCheck =
9630: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
9640: 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  db, pTab->pCheck
9650: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
9660: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
9670: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
9680: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65  rDelete(db, pChe
9690: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
96a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
96b0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
96c0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
96d0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
96e0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
96f0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
9700: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9710: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
9720: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9730: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
9740: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
9750: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
9760: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
9770: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
9780: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
9790: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
97a0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
97b0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
97c0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
97d0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
97e0: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
97f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
9800: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
9810: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
9820: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
9830: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
9840: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
9850: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
9860: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
9870: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
9880: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
9890: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
98a0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
98b0: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
98c0: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
98d0: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
98e0: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
98f0: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
9900: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
9910: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
9920: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
9930: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
9940: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
9950: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
9960: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
9970: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
9980: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
9990: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
99a0: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
99b0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
99c0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
99d0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
99e0: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
99f0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
9a00: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
9a10: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
9a20: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
9a30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9a40: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a   zColl);.  }.}..
9a50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9a60: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
9a70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9a80: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
9a90: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
9aa0: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
9ab0: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
9ac0: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
9ad0: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
9ae0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
9af0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9b00: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
9b10: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
9b20: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
9b30: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
9b40: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
9b50: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
9b60: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
9b70: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
9b80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9b90: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
9ba0: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
9bb0: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
9bc0: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
9bd0: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
9be0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
9bf0: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
9c00: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
9c10: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
9c20: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
9c30: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9c40: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
9c50: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
9c60: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
9c70: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
9c80: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
9c90: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
9ca0: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
9cb0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
9cc0: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
9cd0: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
9ce0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
9cf0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
9d00: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
9d10: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9d20: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
9d30: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
9d40: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
9d50: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
9d60: 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
9d70: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
9d80: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20  3FindCollSeq(), 
9d90: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
9da0: 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  q().*/.CollSeq *
9db0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9dc0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
9dd0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9de0: 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
9df0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9e00: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
9e10: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
9e20: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
9e30: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
9e40: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
9e50: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
9e60: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
9e70: 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  zName, initbusy)
9e80: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
9e90: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
9ea0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
9eb0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
9ec0: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64  ite3GetCollSeq(d
9ed0: 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  b, pColl, zName)
9ee0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
9ef0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9f00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9f10: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
9f20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
9f30: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
9f40: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9f50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
9f60: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9f70: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
9f80: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
9f90: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
9fa0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
9fb0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
9fc0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
9fd0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
9fe0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
9ff0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
a000: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
a010: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
a020: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
a030: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
a040: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
a050: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
a060: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
a070: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
a080: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
a090: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
a0a0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
a0b0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
a0c0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
a0d0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
a0e0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
a0f0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
a100: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
a110: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
a120: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
a130: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
a140: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
a150: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
a160: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
a170: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
a180: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a190: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a1a0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a1b0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a1c0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a1d0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a1e0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a1f0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a200: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a210: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a220: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a230: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a240: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a250: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a260: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a270: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a280: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a290: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a2a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a2b0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
a2c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a2d0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a2e0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a2f0: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a300: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a310: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a320: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a330: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
a340: 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20  _VERSION, r1);. 
a350: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a360: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a370: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
a380: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
a390: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
a3a0: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
a3b0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
a3c0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
a3d0: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
a3e0: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
a3f0: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
a400: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
a410: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
a420: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
a430: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
a440: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
a450: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
a460: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
a470: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
a480: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
a490: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
a4a0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
a4b0: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
a4c0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
a4d0: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
a4e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
a4f0: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
a500: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
a510: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
a520: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
a530: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
a540: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
a550: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
a560: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
a570: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
a580: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
a590: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
a5a0: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
a5b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
a5c0: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
a5d0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
a5e0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
a5f0: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
a600: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
a610: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
a620: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
a630: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
a640: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
a650: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
a660: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
a670: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
a680: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
a690: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
a6a0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
a6b0: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
a6c0: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
a6d0: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
a6e0: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
a6f0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
a700: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
a710: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
a720: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
a730: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
a740: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
a750: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
a760: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
a770: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
a780: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
a790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
a7a0: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
a7b0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
a7c0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
a7d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a7e0: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
a7f0: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
a800: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
a810: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
a820: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
a830: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a840: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
a850: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
a860: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a870: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a880: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a890: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
a8a0: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
a8b0: 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79  ]) || sqlite3Key
a8c0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
a8d0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
a8e0: 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a  ( !needQuote ){.
a8f0: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
a900: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a  zIdent[j];.  }..
a910: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
a920: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
a930: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a940: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a950: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
a960: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
a970: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
a980: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
a990: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a9a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a9b0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
a9c0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
a9d0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
a9e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a9f0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
aa00: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
aa10: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
aa20: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
aa30: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
aa40: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
aa50: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
aa60: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
aa70: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
aa80: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
aa90: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
aaa0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
aab0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
aac0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
aad0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
aae0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
aaf0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
ab00: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
ab10: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
ab20: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
ab30: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
ab40: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
ab50: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
ab60: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
ab70: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
ab80: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
ab90: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
aba0: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
abb0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
abc0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
abd0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
abe0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
abf0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
ac00: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
ac10: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
ac20: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
ac30: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
ac40: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20  qlite3Malloc( n 
ac50: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
ac60: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
ac70: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
ac80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ac90: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
aca0: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43  ntf(n, zStmt, "C
acb0: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
acc0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72    k = sqlite3Str
acd0: 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20  len30(zStmt);.  
ace0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
acf0: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
ad00: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
ad10: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
ad20: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
ad30: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
ad40: 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ++){.    static 
ad50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
ad60: 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a  st azType[] = {.
ad70: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
ad80: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f  E_AFF_TEXT    */
ad90: 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20   " TEXT",.      
ada0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
adb0: 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20  NONE    */ "",. 
adc0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
add0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20  _AFF_NUMERIC */ 
ade0: 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20  " NUM",.        
adf0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  /* SQLITE_AFF_IN
ae00: 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c  TEGER */ " INT",
ae10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
ae20: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a  TE_AFF_REAL    *
ae30: 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b  / " REAL".    };
ae40: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
ae50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ae60: 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
ae70: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
ae80: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
ae90: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
aea0: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d  e3Strlen30(&zStm
aeb0: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
aec0: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
aed0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
aee0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
aef0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
af00: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
af10: 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29  _AFF_TEXT >= 0 )
af20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
af30: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
af40: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 73  ITE_AFF_TEXT < s
af50: 69 7a 65 6f 66 28 61 7a 54 79 70 65 29 2f 73 69  izeof(azType)/si
af60: 7a 65 6f 66 28 61 7a 54 79 70 65 5b 30 5d 29 20  zeof(azType[0]) 
af70: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
af80: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
af90: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
afa0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
afb0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
afc0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
afd0: 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
afe0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
aff0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
b000: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
b010: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b020: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b030: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
b040: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b050: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b060: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
b070: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
b080: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
b090: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
b0a0: 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e  F_TEXT];.    len
b0b0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
b0c0: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
b0d0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
b0e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b0f0: 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20  F_NONE .        
b100: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
b110: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
b120: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
b130: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
b140: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
b150: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
b160: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
b170: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
b180: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b190: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
b1a0: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
b1b0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
b1c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b1d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
b1e0: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
b1f0: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
b200: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
b210: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b220: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
b230: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
b240: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
b250: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
b260: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
b270: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
b280: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
b290: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
b2a0: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
b2b0: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
b2c0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
b2d0: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
b2e0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
b2f0: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
b300: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
b310: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
b320: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
b330: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
b340: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
b350: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
b360: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
b370: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
b380: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
b390: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
b3a0: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
b3b0: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
b3c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
b3d0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
b3e0: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
b3f0: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
b400: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
b410: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
b420: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
b430: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
b440: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
b450: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
b460: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
b470: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
b480: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
b490: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
b4a0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
b4b0: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
b4c0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
b4d0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
b4e0: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
b4f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
b500: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
b510: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
b520: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
b530: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
b540: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
b550: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
b560: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
b570: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
b580: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
b590: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
b5a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
b5b0: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
b5c0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
b5d0: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
b5e0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
b5f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e        /* The fin
b600: 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20  al ')' token in 
b610: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
b620: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
b630: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
b640: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
b650: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
b660: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
b670: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
b680: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b690: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
b6a0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
b6b0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
b6c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b6d0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
b6e0: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
b6f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
b700: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b710: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
b720: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
b730: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
b740: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
b750: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
b760: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
b770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b780: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
b790: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
b7a0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b7b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
b7c0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
b7d0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
b7e0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
b7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
b800: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
b810: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
b820: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
b830: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
b840: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
b850: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
b860: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
b870: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
b880: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
b890: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
b8a0: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
b8b0: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
b8c0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
b8d0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
b8e0: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
b8f0: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
b900: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
b910: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
b920: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
b930: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
b940: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
b950: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
b960: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
b970: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
b980: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
b990: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
b9a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
b9b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
b9c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b9d0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
b9e0: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
b9f0: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
ba00: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
ba10: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
ba20: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
ba30: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
ba40: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
ba50: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
ba60: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
ba70: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
ba80: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
ba90: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
baa0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
bab0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
bac0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
bad0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
bae0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
baf0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
bb00: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
bb10: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
bb20: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
bb30: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
bb40: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
bb50: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
bb60: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
bb70: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
bb80: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
bb90: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
bba0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
bbb0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
bbc0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
bbd0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
bbe0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
bbf0: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
bc00: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
bc10: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
bc20: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
bc30: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
bc40: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
bc50: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
bc60: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
bc70: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
bc80: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
bc90: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
bca0: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
bcb0: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
bcc0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
bcd0: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
bce0: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
bcf0: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
bd00: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
bd10: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
bd20: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
bd30: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
bd40: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
bd50: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e  arse);.    if( N
bd60: 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
bd70: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
bd80: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
bd90: 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
bda0: 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
bdb0: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
bdc0: 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
bdd0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
bde0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
bdf0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
be00: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
be10: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
be20: 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
be30: 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
be40: 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
be50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
be60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
be70: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
be80: 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
be90: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
bea0: 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
beb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
bec0: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
bed0: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
bee0: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
bef0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
bf00: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
bf10: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
bf20: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
bf30: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
bf40: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
bf50: 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
bf60: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
bf70: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
bf80: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
bf90: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
bfa0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
bfb0: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
bfc0: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
bfd0: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
bfe0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
bff0: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
c000: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
c010: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
c020: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
c030: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
c040: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
c050: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
c060: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
c070: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
c080: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
c090: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
c0a0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
c0b0: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
c0c0: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
c0d0: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
c0e0: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
c0f0: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
c100: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
c110: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
c120: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
c130: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
c140: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
c150: 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c  dest;.      Tabl
c160: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20  e *pSelTab;..   
c170: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
c180: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
c190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c1a0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
c1b0: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
c1c0: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
c1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1e0: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
c1f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
c200: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
c210: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
c220: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54  nit(&dest, SRT_T
c230: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
c240: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c250: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
c260: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
c270: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c280: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
c290: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
c2a0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
c2b0: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
c2c0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
c2d0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
c2e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
c2f0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
c300: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
c310: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
c320: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
c330: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
c340: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
c350: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
c360: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
c370: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
c380: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
c390: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
c3a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c3b0: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c  DeleteTable(pSel
c3c0: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
c3d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
c3e0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
c3f0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
c400: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
c410: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
c420: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
c430: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
c440: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
c450: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28  lse{.      n = (
c460: 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70  int)(pEnd->z - p
c470: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
c480: 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  n.z) + 1;.      
c490: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
c4a0: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
c4b0: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
c4c0: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
c4d0: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
c4e0: 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
c4f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c500: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
c510: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
c520: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
c530: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
c540: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c550: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
c560: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
c570: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
c580: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
c590: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
c5a0: 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ected..    */.  
c5b0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
c5c0: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
c5d0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
c5e0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
c5f0: 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
c600: 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
c610: 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20  , rootpage=#%d, 
c620: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
c630: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64  "WHERE rowid=#%d
c640: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
c650: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
c660: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
c670: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
c680: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
c690: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
c6a0: 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
c6b0: 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
c6c0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
c6d0: 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
c6e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c6f0: 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
c700: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
c710: 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
c720: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
c730: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
c740: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
c750: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
c760: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
c770: 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
c780: 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
c790: 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
c7a0: 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
c7b0: 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
c7c0: 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61     if( p->tabFla
c7d0: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
c7e0: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44  ement ){.      D
c7f0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
c800: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  b[iDb];.      if
c810: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
c820: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
c830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
c840: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
c850: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
c860: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
c870: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
c880: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
c890: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
c8a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
c8b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
c8c0: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
c8d0: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
c8e0: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
c8f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
c900: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
c910: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61  eAddOp4(v, OP_Pa
c920: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
c930: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  0, 0,.        sq
c940: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c950: 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22   "tbl_name='%q'"
c960: 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44  ,p->zName), P4_D
c970: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20  YNAMIC);.  }... 
c980: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
c990: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
c9a0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
c9b0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
c9c0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
c9d0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
c9e0: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
c9f0: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
ca00: 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61  ema = p->pSchema
ca10: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
ca20: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
ca30: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
ca40: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ca70: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d  Strlen30(p->zNam
ca80: 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e),p);.    if( p
ca90: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
caa0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
cab0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
cac0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
cad0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
cae0: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
caf0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
cb00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
cb10: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
cb20: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
cb30: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
cb40: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
cb50: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
cb60: 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
cb70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
cb80: 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
cb90: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
cba0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cbb0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
cbc0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
cbd0: 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
cbe0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
cbf0: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
cc00: 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
cc10: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
cc20: 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
cc30: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
cc40: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
cc50: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
cc60: 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
cc70: 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
cc80: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
cc90: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
cca0: 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
ccb0: 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
ccc0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
ccd0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
cce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ccf0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
cd00: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
cd10: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
cd20: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
cd30: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
cd40: 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
cd50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
cd60: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
cd70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
cd80: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
cd90: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
cda0: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
cdb0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
cdc0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
cdd0: 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
cde0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
cdf0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
ce00: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
ce10: 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
ce20: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
ce30: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
ce40: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
ce50: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
ce60: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
ce70: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
ce80: 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
ce90: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
cea0: 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
ceb0: 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
cec0: 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
ced0: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
cee0: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
cef0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
cf00: 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
cf10: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
cf20: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
cf30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const 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 29 7b  e;.  if( p==0 ){
d090: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d0a0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d0b0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
d0c0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
d0d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
d0e0: 20 29 3b 20 2f 2a 20 49 66 20 73 71 6c 69 74 65   ); /* If sqlite
d0f0: 33 53 74 61 72 74 54 61 62 6c 65 20 72 65 74 75  3StartTable retu
d100: 72 6e 20 6e 6f 6e 2d 4e 55 4c 4c 20 74 68 65 6e  rn non-NULL then
d110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
d130: 20 74 68 65 72 65 20 63 6f 75 6c 64 20 6e 6f 74   there could not
d140: 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20 65 72   have been an er
d150: 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ror */.  sqlite3
d160: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
d170: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
d180: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
d190: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
d1a0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
d1b0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28  >pSchema);.  if(
d1c0: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
d1d0: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
d1e0: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
d1f0: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
d200: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
d210: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
d220: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d230: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d240: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d250: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
d260: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
d270: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
d280: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
d290: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
d2a0: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
d2b0: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
d2c0: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
d2d0: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
d2e0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
d2f0: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
d300: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
d310: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
d320: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
d330: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
d340: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
d350: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
d360: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
d370: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
d380: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d390: 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
d3a0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
d3b0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
d3c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d3d0: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
d3e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d3f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d400: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
d410: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
d420: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d430: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
d440: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d450: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
d460: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
d470: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
d480: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
d490: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
d4a0: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
d4b0: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
d4c0: 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a  f( ALWAYS(sEnd.z
d4d0: 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e  [0]!=0) && sEnd.
d4e0: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
d4f0: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
d500: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
d510: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
d520: 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
d530: 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  ->z);.  z = pBeg
d540: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
d550: 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73  ALWAYS(n>0) && s
d560: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
d570: 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
d580: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
d590: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
d5a0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
d5b0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
d5c0: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
d5d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
d5e0: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
d5f0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
d600: 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
d610: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
d620: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d630: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
d640: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d650: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
d660: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d670: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d680: 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
d690: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
d6a0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
d6b0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
d6c0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
d6d0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
d6e0: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
d6f0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
d700: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
d710: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
d720: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
d730: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
d740: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
d750: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
d760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d770: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
d780: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
d790: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
d7a0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
d7b0: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
d7c0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
d7d0: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
d7e0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
d7f0: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
d800: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
d810: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
d820: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
d830: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
d840: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d850: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
d860: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
d870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
d880: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
d890: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
d8a0: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
d8b0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
d8c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
d8d0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d8e0: 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
d8f0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
d900: 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c   (*xAuth)(void*,
d910: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  int,const char*,
d920: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
d930: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
d940: 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ar*);..  assert(
d950: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
d960: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d970: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
d980: 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
d990: 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
d9a0: 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
d9b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
d9c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
d9d0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
d9e0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
d9f0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
da00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
da10: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
da20: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
da30: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
da40: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
da50: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
da60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
da70: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
da80: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
da90: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
daa0: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
dab0: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
dac0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
dad0: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
dae0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
daf0: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
db00: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
db10: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
db20: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
db30: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
db40: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
db50: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
db60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
db70: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
db80: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
db90: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
dba0: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
dbb0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
dbc0: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
dbd0: 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
dbe0: 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
dbf0: 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
dc00: 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
dc10: 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
dc20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
dc30: 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
dc40: 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
dc50: 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
dc60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
dc70: 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
dc80: 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
dc90: 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
dca0: 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
dcb0: 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
dcc0: 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
dcd0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
dce0: 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
dcf0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
dd00: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
dd10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
dd20: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
dd30: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
dd40: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
dd50: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
dd60: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
dd70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
dd80: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
dd90: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
dda0: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
ddb0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
ddc0: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
ddd0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
dde0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
ddf0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
de00: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
de10: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
de20: 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
de30: 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
de40: 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
de50: 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
de60: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
de70: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
de80: 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
de90: 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
dea0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
deb0: 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
dec0: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
ded0: 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
dee0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
def0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
df00: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
df10: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
df20: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
df30: 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
df40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
df50: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
df60: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
df70: 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65  pSel ){.    u8 e
df80: 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d  nableLookaside =
df90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
dfa0: 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d  Enabled;.    n =
dfb0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
dfc0: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
dfd0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
dfe0: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
dff0: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
e000: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64  nCol = -1;.    d
e010: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e020: 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64  abled = 0;.#ifnd
e030: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e040: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
e050: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
e060: 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
e070: 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
e080: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
e090: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
e0a0: 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
e0b0: 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
e0c0: 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
e0d0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
e0e0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
e0f0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
e100: 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c  #endif.    db->l
e110: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e120: 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73  d = enableLookas
e130: 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ide;.    pParse-
e140: 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69  >nTab = n;.    i
e150: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
e160: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e170: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
e180: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
e190: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
e1a0: 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  l;.      pTable-
e1b0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
e1c0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
e1d0: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
e1e0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
e1f0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
e200: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
e210: 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  e(pSelTab);.    
e220: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
e230: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
e240: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
e250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
e260: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
e270: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
e280: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
e290: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e2a0: 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20  pSel);.  } else 
e2b0: 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
e2c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e2d0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
e2e0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
e2f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
e300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e310: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
e320: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e330: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
e340: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e350: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
e360: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
e370: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
e380: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
e390: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
e3a0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
e3b0: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
e3c0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
e3d0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
e3e0: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
e3f0: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
e400: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
e410: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
e420: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
e430: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
e440: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
e450: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
e460: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
e470: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e480: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
e490: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
e4a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
e4b0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
e4c0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
e4d0: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
e4e0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
e4f0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
e500: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
e510: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
e520: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
e530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e540: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
e550: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e560: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
e570: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
e580: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
e590: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
e5a0: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
e5b0: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
e5c0: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
e5d0: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
e5e0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
e5f0: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
e600: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
e610: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
e620: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
e630: 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
e640: 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
e650: 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
e660: 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
e670: 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
e680: 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
e690: 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
e6a0: 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
e6b0: 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
e6c0: 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
e6d0: 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
e6e0: 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
e6f0: 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
e700: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
e710: 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
e720: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
e730: 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
e740: 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
e750: 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
e760: 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
e770: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
e780: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
e790: 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
e7a0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
e7b0: 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
e7c0: 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
e7d0: 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
e7e0: 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
e7f0: 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
e800: 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
e810: 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
e820: 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
e830: 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
e840: 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
e850: 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
e860: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
e870: 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
e880: 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
e890: 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
e8a0: 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
e8b0: 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
e8c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e8d0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
e8e0: 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
e8f0: 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69  Moved(Db *pDb, i
e900: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
e910: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
e920: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
e930: 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d  Hash;..  pHash =
e940: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
e950: 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
e960: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
e970: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
e980: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
e990: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
e9a0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
e9b0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
e9c0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
e9d0: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
e9e0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
e9f0: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
ea00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
ea10: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
ea20: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
ea30: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
ea40: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
ea50: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
ea60: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
ea70: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
ea80: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
ea90: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
eaa0: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
eab0: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
eac0: 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
ead0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
eae0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
eaf0: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
eb00: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
eb10: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
eb20: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
eb30: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
eb40: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
eb50: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eb60: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
eb70: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
eb80: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
eb90: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
eba0: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
ebb0: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
ebc0: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
ebd0: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
ebe0: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
ebf0: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
ec00: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
ec10: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
ec20: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
ec30: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
ec40: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
ec50: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
ec60: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ec70: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
ec80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ec90: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
eca0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
ecb0: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
ecc0: 31 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66  1, iDb);.#ifndef
ecd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ece0: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
ecf0: 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
ed00: 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
ed10: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
ed20: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
ed30: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
ed40: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ed50: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
ed60: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
ed70: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
ed80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
ed90: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
eda0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
edb0: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
edc0: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
edd0: 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
ede0: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
edf0: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
ee00: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
ee10: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
ee20: 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
ee30: 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
ee40: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
ee50: 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
ee60: 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
ee70: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
ee80: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
ee90: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
eea0: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
eeb0: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
eec0: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
eed0: 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
eee0: 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
eef0: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
ef00: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
ef10: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
ef20: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
ef30: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
ef40: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
ef50: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
ef60: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
ef70: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
ef80: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
ef90: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
efa0: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
efb0: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
efc0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
efd0: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
efe0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
eff0: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
f000: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
f010: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
f020: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
f030: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
f040: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
f050: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
f060: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
f070: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
f080: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
f090: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
f0a0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
f0b0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
f0c0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f0d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f0e0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f0f0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f100: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f110: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f120: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
f130: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f140: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
f150: 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
f160: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f170: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f180: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
f190: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f1a0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
f1b0: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
f1c0: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
f1d0: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
f1e0: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
f1f0: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
f200: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
f210: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
f220: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
f230: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
f240: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
f250: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
f260: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
f270: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
f280: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
f290: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
f2a0: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
f2b0: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
f2c0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
f2d0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
f2e0: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
f2f0: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
f300: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
f310: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
f320: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
f330: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
f340: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
f350: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
f360: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
f370: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
f380: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
f390: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
f3a0: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
f3b0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
f3c0: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
f3d0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
f3e0: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
f3f0: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
f400: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
f410: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
f420: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
f430: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
f440: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
f450: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
f460: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
f470: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
f480: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
f490: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
f4a0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
f4b0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
f4c0: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
f4d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
f4e0: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
f4f0: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
f500: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
f510: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
f520: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
f530: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
f540: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
f550: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
f560: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
f570: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f580: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
f590: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
f5a0: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
f5b0: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
f5c0: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
f5d0: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
f5e0: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
f5f0: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
f600: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f610: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
f620: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
f630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
f640: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
f650: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
f660: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
f670: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
f680: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
f690: 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
f6a0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
f6b0: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
f6c0: 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
f6d0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
f6e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f6f0: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
f700: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
f710: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
f720: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
f730: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
f740: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
f750: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f760: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
f770: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
f780: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
f790: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
f7a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f7b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
f7c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
f7d0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
f7e0: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
f7f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f800: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f810: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
f820: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
f830: 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
f840: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
f850: 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
f860: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
f870: 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20  pParse, isView, 
f880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 61               pNa
f8a0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
f8b0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
f8c0: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
f8d0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
f8e0: 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20  ( noErr ){.     
f8f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65   sqlite3ErrorCle
f900: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
f910: 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  }.    goto exit_
f920: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
f930: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
f940: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
f950: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f960: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
f970: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
f980: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
f990: 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
f9a0: 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
f9b0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
f9c0: 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
f9d0: 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
f9e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
f9f0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
fa00: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
fa10: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
fa20: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
fa30: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fa40: 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
fa50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fa60: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
fa70: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
fa80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
fa90: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
faa0: 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
fab0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
fac0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
fad0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fae0: 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
faf0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
fb00: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fb10: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
fb20: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
fb30: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fb40: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
fb50: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
fb60: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
fb70: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
fb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
fb90: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
fba0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
fbb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
fbc0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fbd0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
fbe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fbf0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fc00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
fc10: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
fc20: 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53  {.      code = S
fc30: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
fc40: 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d  E;.      zArg2 =
fc50: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
fc60: 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f  e(db, pTab)->pMo
fc70: 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66  d->zName;.#endif
fc80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fc90: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
fca0: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
fcb0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
fcc0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
fcd0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
fce0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
fcf0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
fd00: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
fd10: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
fd20: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
fd30: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
fd40: 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a  >zName, zArg2, z
fd50: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
fd60: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fd70: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fd80: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
fd90: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
fda0: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
fdb0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
fdc0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
fdd0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
fde0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
fdf0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
fe00: 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
fe10: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
fe20: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fe30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fe40: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
fe50: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
fe60: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
fe70: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fe80: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
fe90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fea0: 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
feb0: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
fec0: 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
fed0: 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
fee0: 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
fef0: 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
ff00: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
ff10: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
ff20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
ff30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ff40: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
ff50: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
ff60: 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
ff70: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
ff80: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ff90: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
ffa0: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
ffb0: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
ffc0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ffd0: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
ffe0: 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
fff0: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
10000 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
10010 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10020 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
10030 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10040 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
10050 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
10060 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
10070 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
10080 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
10090 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
100a0 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
100b0 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62  pTrigger;.    Db
100c0 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
100d0 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
100e0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
100f0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
10100 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10120 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
10130 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10140 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10150 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10160 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
10170 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
10180 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
10190 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
101a0 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
101b0 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
101c0 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61      ** is genera
101d0 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
101e0 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
101f0 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
10200 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65      ** sqlite_te
10210 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
10220 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
10230 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
10240 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
10250 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
10260 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
10270 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
10280 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
10290 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
102a0 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
102b0 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63     pTrigger->pSc
102c0 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
102d0 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
102e0 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
102f0 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
10300 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20  pTrigger);.     
10310 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
10320 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
10330 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
10340 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
10350 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d  EMENT.    /* Rem
10360 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
10370 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
10380 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
10390 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
103a0 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
103b0 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
103c0 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
103d0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
103e0 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20  opped.    ** at 
103f0 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
10400 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
10410 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
10420 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  le needs to.    
10430 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
10440 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
10450 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
10460 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
10470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10480 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
10490 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
104a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
104b0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
104c0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
104d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73  DELETE FROM %s.s
104e0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
104f0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
10500 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
10510 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
10520 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
10530 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ndif..    /* Dro
10540 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
10550 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
10560 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
10570 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
10580 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
10590 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
105a0 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
105b0 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
105c0 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
105d0 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
105e0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
105f0 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
10600 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
10610 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
10620 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
10630 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
10640 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
10650 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
10660 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
10670 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
10680 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
10690 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
106a0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
106b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
106c0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
106d0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
106e0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
106f0 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
10700 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
10710 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
10720 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
10730 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
10740 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ), pTab->zName);
10750 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e  ..    /* Drop an
10760 79 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f  y statistics fro
10770 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
10780 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74 20  t1 table, if it 
10790 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 66  exists */.    if
107a0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
107b0 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
107c0 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69  tat1", db->aDb[i
107d0 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  Db].zName) ){.  
107e0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
107f0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
10800 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
10810 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
10820 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25 51  at1 WHERE tbl=%Q
10830 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70  ", pDb->zName, p
10840 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
10850 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
10860 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
10870 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10880 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
10890 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
108a0 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
108b0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
108c0 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
108d0 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
108e0 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
108f0 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
10900 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
10910 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  */.    if( IsVir
10920 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
10930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10940 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
10950 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
10960 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10980 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10990 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
109a0 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
109b0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
109c0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
109d0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
109e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65  .  }.  sqliteVie
109f0 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
10a00 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74  b);..exit_drop_t
10a10 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
10a20 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
10a30 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
10a40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10a50 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
10a60 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
10a70 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
10a80 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
10a90 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10aa0 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
10ab0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
10ac0 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
10ad0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
10ae0 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
10af0 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
10b00 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
10b10 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
10b20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
10b30 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
10b40 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
10b50 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
10b60 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
10b70 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
10b80 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
10b90 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
10ba0 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
10bb0 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
10bc0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
10bd0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
10be0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
10bf0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
10c00 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
10c10 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
10c20 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
10c30 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
10c40 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
10c50 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
10c60 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
10c70 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
10c80 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
10c90 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
10ca0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
10cb0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
10cc0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
10cd0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10ce0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
10cf0 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
10d00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
10d10 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
10d20 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
10d30 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
10d40 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
10d50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10d60 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
10d70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10d80 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10d90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
10da0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
10db0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
10dc0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
10dd0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
10de0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
10df0 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
10e00 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10e10 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10e20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
10e30 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
10e40 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
10e50 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
10e60 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
10e70 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
10e80 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
10e90 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
10ea0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10eb0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
10ec0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10ed0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
10ee0 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
10ef0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10f00 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
10f10 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
10f20 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
10f30 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
10f40 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
10f50 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
10f60 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
10f70 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
10f80 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
10f90 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
10fa0 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  -1;.    if( NEVE
10fb0 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f  R(iCol<0) ) goto
10fc0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
10fd0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
10fe0 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
10ff0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11000 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
11010 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
11020 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
11030 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
11040 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
11050 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
11060 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
11070 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
11080 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
11090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
110a0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
110b0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
110c0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
110d0 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
110e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
110f0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
11100 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
11110 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
11120 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
11130 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
11140 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
11150 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
11160 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
11170 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
11180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
11190 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
111a0 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
111b0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
111c0 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
111d0 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
111e0 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
111f0 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
11200 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
11210 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
11220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
11230 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
11240 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
11250 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
11260 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
11270 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11280 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
11290 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
112a0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
112b0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
112c0 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
112d0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
112e0 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
112f0 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
11300 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  ->aCol[nCol];.  
11310 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
11320 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
11330 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
11340 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
11350 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
11360 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  );.  z += pTo->n
11370 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f  +1;.  pFKey->nCo
11380 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
11390 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
113a0 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
113b0 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
113c0 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
113d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
113e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
113f0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
11400 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
11410 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
11420 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
11430 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
11440 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
11450 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
11460 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
11470 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
11480 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
11490 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
114a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
114b0 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
114c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
114d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
114e0 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
114f0 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
11500 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
11510 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
11520 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
11530 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
11540 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
11550 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
11560 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
11570 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
11580 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
11590 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
115a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
115b0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
115c0 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
115d0 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
115e0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
115f0 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
11600 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
11610 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
11620 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
11630 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
11640 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
11650 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
11660 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20   = (u8)(flags & 
11670 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e  0xff);.  pFKey->
11680 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 75 38  updateConf = (u8
11690 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
116a0 26 20 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79  & 0xff);.  pFKey
116b0 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28  ->insertConf = (
116c0 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 31 36  u8)((flags >> 16
116d0 20 29 20 26 20 30 78 66 66 29 3b 0a 0a 20 20 2f   ) & 0xff);..  /
116e0 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
116f0 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
11700 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
11710 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
11720 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
11730 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
11740 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
11750 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
11760 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
11770 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11780 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
11790 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
117a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
117b0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
117c0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
117d0 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
117e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
117f0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
11800 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
11810 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
11820 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
11830 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
11840 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
11850 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
11860 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
11870 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
11880 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
11890 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
118a0 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
118b0 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
118c0 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
118d0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
118e0 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
118f0 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
11900 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
11910 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11920 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
11930 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11940 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
11950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11960 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
11970 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
11980 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
11990 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
119a0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
119b0 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
119c0 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
119d0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
119e0 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
119f0 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
11a00 31 20 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  1 );.  pFKey->is
11a10 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
11a20 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
11a30 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
11a40 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
11a50 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
11a60 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
11a70 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
11a80 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
11a90 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
11aa0 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
11ab0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
11ac0 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
11ad0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
11ae0 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
11af0 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
11b00 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
11b10 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
11b20 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11b30 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
11b40 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
11b50 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
11b60 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
11b70 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
11b80 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
11b90 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
11ba0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
11bb0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
11bc0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
11bd0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
11be0 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
11bf0 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
11c00 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
11c10 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
11c20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
11c30 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
11c40 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
11c50 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
11c60 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
11c70 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
11c80 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
11c90 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
11ca0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
11cb0 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
11cc0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
11cd0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
11ce0 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
11cf0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
11d00 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
11d10 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
11d20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
11d30 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
11d40 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
11d50 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
11d60 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d80 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
11d90 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
11da0 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
11dd0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
11de0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
11df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
11e00 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
11e10 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
11e20 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  chine */.  KeyIn
11e30 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20  fo *pKey;       
11e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
11e50 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a  Info for index *
11e60 2f 0a 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65  /.  int regIdxKe
11e70 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
11e80 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
11e90 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
11ea0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ndex key */.  in
11eb0 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ed0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
11ee0 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65   assemblied inde
11ef0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
11f00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11f10 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
11f20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
11f30 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
11f40 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11f50 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11f60 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
11f70 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
11f80 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11f90 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
11fa0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11fb0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
11fc0 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
11fd0 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
11fe0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
11ff0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
12000 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
12010 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
12020 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
12030 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
12040 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
12050 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
12060 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
12070 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
12080 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
12090 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
120a0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
120b0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
120c0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
120d0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
120e0 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
120f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
12100 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
12110 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
12120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
12130 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
12140 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
12150 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
12160 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  fo(pParse, pInde
12170 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
12180 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
12190 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
121a0 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
121c0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
121d0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
121e0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
121f0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  age>=0 ){.    sq
12200 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12210 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73  5(v, 1);.  }.  s
12220 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
12230 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
12240 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
12250 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
12260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12270 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
12280 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67   iTab, 0);.  reg
12290 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
122a0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
122b0 65 29 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20  e);.  regIdxKey 
122c0 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
122d0 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
122e0 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20  , pIndex, iTab, 
122f0 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20  regRecord, 1);. 
12300 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
12310 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
12320 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 72  .    const int r
12330 65 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78  egRowid = regIdx
12340 4b 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43  Key + pIndex->nC
12350 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  olumn;.    const
12360 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65   int j2 = sqlite
12370 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
12380 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69  (v) + 2;.    voi
12390 64 20 2a 20 63 6f 6e 73 74 20 70 52 65 67 4b 65  d * const pRegKe
123a0 79 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  y = SQLITE_INT_T
123b0 4f 5f 50 54 52 28 72 65 67 49 64 78 4b 65 79 29  O_PTR(regIdxKey)
123c0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
123d0 67 69 73 74 65 72 73 20 61 63 63 65 73 73 65 64  gisters accessed
123e0 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69   by the OP_IsUni
123f0 71 75 65 20 6f 70 63 6f 64 65 20 77 65 72 65 20  que opcode were 
12400 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
12410 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 47 65   using sqlite3Ge
12420 74 54 65 6d 70 52 61 6e 67 65 28 29 20 69 6e 73  tTempRange() ins
12430 69 64 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ide of the sqlit
12440 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
12450 65 79 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ey().    ** call
12460 20 61 62 6f 76 65 2e 20 4a 75 73 74 20 62 65 66   above. Just bef
12470 6f 72 65 20 74 68 61 74 20 66 75 6e 63 74 69 6f  ore that functio
12480 6e 20 77 61 73 20 66 72 65 65 64 20 74 68 65 79  n was freed they
12490 20 77 65 72 65 20 72 65 6c 65 61 73 65 64 0a 20   were released. 
124a0 20 20 20 2a 2a 20 28 6d 61 64 65 20 61 76 61 69     ** (made avai
124b0 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d  lable to the com
124c0 70 69 6c 65 72 20 66 6f 72 20 72 65 75 73 65 29  piler for reuse)
124d0 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73   using .    ** s
124e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
124f0 70 52 61 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20  pRange(). So in 
12500 73 6f 6d 65 20 77 61 79 73 20 68 61 76 69 6e 67  some ways having
12510 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
12520 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75  .    ** opcode u
12530 73 65 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  se the values st
12540 6f 72 65 64 20 77 69 74 68 69 6e 20 73 65 65 6d  ored within seem
12550 73 20 64 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77  s dangerous. How
12560 65 76 65 72 2c 20 73 69 6e 63 65 0a 20 20 20 20  ever, since.    
12570 2a 2a 20 77 65 20 63 61 6e 20 62 65 20 73 75 72  ** we can be sur
12580 65 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  e that no other 
12590 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 68  temp registers h
125a0 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
125b0 65 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  ed.    ** since 
125c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
125d0 6d 70 52 61 6e 67 65 28 29 20 77 61 73 20 63 61  mpRange() was ca
125e0 6c 6c 65 64 2c 20 69 74 20 69 73 20 73 61 66 65  lled, it is safe
125f0 20 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a   to do so..    *
12600 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
12610 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73  eAddOp4(v, OP_Is
12620 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 6a 32  Unique, iIdx, j2
12630 2c 20 72 65 67 52 6f 77 69 64 2c 20 70 52 65 67  , regRowid, pReg
12640 4b 65 79 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  Key, P4_INT32);.
12650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12660 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp4(v, OP_Halt
12670 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
12680 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 30  INT, OE_Abort, 0
12690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
126a0 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63        "indexed c
126b0 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75  olumns are not u
126c0 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49  nique", P4_STATI
126d0 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  C);.  }.  sqlite
126e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
126f0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
12700 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
12710 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
12720 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
12730 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
12740 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12750 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12760 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
12770 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12780 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
12790 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c   addr1+1);.  sql
127a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
127b0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71  (v, addr1);.  sq
127c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
127d0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
127e0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
127f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
12800 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f  ose, iIdx);.}../
12810 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12820 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
12830 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
12840 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
12850 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
12860 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
12870 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
12880 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
12890 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
128a0 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
128b0 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
128c0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
128d0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
128e0 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
128f0 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
12900 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
12910 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
12920 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
12930 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12940 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
12950 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
12960 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
12970 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
12980 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
12990 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
129a0 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
129b0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
129c0 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
129d0 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
129e0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
129f0 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
12a00 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
12a10 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
12a20 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
12a30 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
12a40 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
12a50 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
12a60 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
12a70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12a80 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
12a90 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
12aa0 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
12ab0 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
12ac0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
12ad0 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
12ae0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
12af0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
12b00 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
12b10 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
12b20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
12b30 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
12b40 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
12b50 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
12b60 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
12b70 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
12b80 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
12b90 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
12ba0 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
12bb0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
12bc0 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
12bd0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
12be0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
12bf0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
12c00 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
12c10 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
12c20 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
12c30 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
12c40 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
12c50 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
12c60 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
12c70 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
12c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
12c90 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
12ca0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
12cb0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
12cc0 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
12cd0 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
12ce0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
12cf0 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
12d00 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
12d10 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t     /* Omit er
12d20 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
12d30 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
12d40 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
12d50 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
12d60 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
12d70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
12d80 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
12d90 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
12da0 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
12db0 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
12dc0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
12dd0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
12de0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
12df0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
12e00 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
12e10 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
12e20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20  Token nullId;   
12e30 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
12e40 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
12e50 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
12e60 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
12e70 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
12e80 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
12e90 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
12ea0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
12eb0 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
12ec0 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
12ed0 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
12ee0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12ef0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12f00 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
12f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
12f20 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
12f30 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
12f40 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
12f50 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
12f60 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12f70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12f80 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
12f90 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
12fa0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
12fb0 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
12fc0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
12fd0 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
12fe0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12ff0 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
13000 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
13010 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
13020 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  int nCol;.  int 
13030 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68  nExtra = 0;.  ch
13040 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 61  ar *zExtra;..  a
13050 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30  ssert( pStart==0
13060 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 20 2f   || pEnd!=0 ); /
13070 2a 20 70 45 6e 64 20 6d 75 73 74 20 62 65 20 6e  * pEnd must be n
13080 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70 53 74 61 72  on-NULL if pStar
13090 74 20 69 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  t is */.  assert
130a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
130b0 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76  0 );      /* Nev
130c0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
130d0 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
130e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
130f0 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
13100 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
13110 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13120 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
13130 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
13140 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
13150 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
13160 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13170 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
13180 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
13190 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
131a0 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
131b0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
131c0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
131d0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
131e0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
131f0 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
13200 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
13210 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
13220 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
13230 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
13240 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
13250 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
13260 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
13270 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
13280 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
13290 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
132a0 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
132b0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
132c0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
132d0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
132e0 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
132f0 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
13300 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13310 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13320 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
13330 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
13340 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
13350 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
13360 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
13370 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
13380 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
13390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
133a0 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
133b0 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
133c0 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
133d0 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
133e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
133f0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
13400 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
13410 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
13420 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
13430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
13440 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
13450 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
13460 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
13470 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
13480 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
13490 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
134a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
134b0 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
134c0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64  Parse, iDb, "ind
134d0 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20  ex", pName) &&. 
134e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69         sqlite3Fi
134f0 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
13500 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b  pTblName).    ){
13510 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
13520 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  e the parser con
13530 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65  structs pTblName
13540 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
13550 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20  dentifier,.     
13560 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72   ** sqlite3FixSr
13570 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20  cList can never 
13580 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fail. */.      a
13590 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
135a0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
135b0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
135c0 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e 61 6d  arse, 0, pTblNam
135d0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a  e->a[0].zName, .
135e0 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65          pTblName
135f0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
13600 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
13610 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
13620 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
13630 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13640 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
13650 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d  Db[iDb].pSchema=
13660 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
13670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
13680 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
13690 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
136a0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
136b0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
136c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
136d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
136e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
136f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
13700 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
13710 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
13720 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [iDb];..  assert
13730 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
13740 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
13750 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
13760 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
13770 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
13780 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
13790 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
137a0 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c  &pTab->zName[7],
137b0 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d  "altertab_",9)!=
137c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
137d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
137e0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
137f0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
13800 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
13810 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13820 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
13830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13840 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
13850 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
13860 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13870 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
13880 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
13890 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
138a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
138b0 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  x;.  }.#endif.#i
138c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
138d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
138e0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
138f0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
13900 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13910 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62  se, "virtual tab
13920 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  les may not be i
13930 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
13940 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13950 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
13960 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
13970 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13980 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
13990 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
139a0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
139b0 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
139c0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
139d0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
139e0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
139f0 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
13a00 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
13a10 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
13a20 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
13a30 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
13a40 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
13a50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
13a60 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
13a70 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
13a80 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
13a90 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
13aa0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
13ab0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
13ac0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
13ad0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
13ae0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
13af0 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
13b00 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
13b10 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
13b20 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
13b30 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
13b40 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
13b50 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
13b60 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
13b70 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
13b80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
13b90 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
13ba0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
13bb0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
13bc0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
13bd0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
13be0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13bf0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13c00 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
13c10 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
13c20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
13c30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13c40 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
13c50 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
13c60 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
13c70 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
13c80 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
13c90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
13ca0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13cb0 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
13cc0 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
13cd0 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
13ce0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
13cf0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13d00 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
13d10 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
13d20 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
13d30 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  Name, pDb->zName
13d40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
13d50 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
13d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13d70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13d80 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
13d90 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
13da0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
13db0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13dc0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
13dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13de0 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
13df0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
13e00 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
13e10 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
13e20 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
13e30 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
13e40 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
13e50 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
13e60 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
13e70 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
13e80 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
13e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
13ea0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13eb0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
13ec0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
13ed0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
13ee0 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
13ef0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
13f00 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
13f10 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
13f20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
13f30 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
13f40 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13f50 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13f60 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
13f70 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
13f80 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
13f90 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13fa0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
13fb0 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
13fc0 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
13fd0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
13fe0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
13ff0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
14000 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
14010 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14020 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
14030 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
14040 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
14050 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14060 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14070 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14080 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
14090 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
140a0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
140b0 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
140c0 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
140d0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
140e0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
140f0 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
14100 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
14110 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
14120 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
14130 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
14140 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
14150 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
14160 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
14170 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
14180 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c 69 74 65  ullId.n = sqlite
14190 33 53 74 72 6c 65 6e 33 30 28 28 63 68 61 72 2a  3Strlen30((char*
141a0 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  )nullId.z);.    
141b0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
141c0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
141d0 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  arse, 0, 0);.   
141e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
141f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14200 5f 69 6e 64 65 78 3b 0a 20 20 20 20 73 71 6c 69  _index;.    sqli
14210 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
14220 6d 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  me(pParse, pList
14230 2c 20 26 6e 75 6c 6c 49 64 2c 20 30 29 3b 0a 20  , &nullId, 0);. 
14240 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
14250 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73  ortOrder = (u8)s
14260 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
14270 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
14280 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
14290 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
142a0 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
142b0 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
142c0 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
142d0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
142e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
142f0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14300 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
14310 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
14320 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14330 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
14340 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
14350 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
14360 3b 0a 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ;.      /* Eithe
14370 72 20 70 43 6f 6c 6c 21 3d 30 20 6f 72 20 74 68  r pColl!=0 or th
14380 65 72 65 20 77 61 73 20 61 6e 20 4f 4f 4d 20 66  ere was an OOM f
14390 61 69 6c 75 72 65 2e 20 20 42 75 74 20 69 66 20  ailure.  But if 
143a0 61 6e 20 4f 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  an OOM.      ** 
143b0 66 61 69 6c 75 72 65 20 77 65 20 68 61 76 65 20  failure we have 
143c0 71 75 69 74 20 62 65 66 6f 72 65 20 72 65 61 63  quit before reac
143d0 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
143e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
143f0 57 41 59 53 28 70 43 6f 6c 6c 29 20 29 7b 0a 20  WAYS(pColl) ){. 
14400 20 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d         nExtra +=
14410 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
14420 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
14430 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
14440 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
14450 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
14460 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
14470 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
14480 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
14490 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c  0(zName);.  nCol
144a0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
144b0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
144c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
144d0 64 62 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  db, .      sizeo
144e0 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20  f(Index) +      
144f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14500 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
14510 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
14520 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
14530 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
14540 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  umn   */.      s
14550 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c  izeof(int)*(nCol
14560 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49  +1) +       /* I
14570 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20  ndex.aiRowEst   
14580 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14590 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20  char *)*nCol +  
145a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
145b0 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
145c0 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
145d0 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  ol +            
145e0 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
145f0 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61  der */.      nNa
14600 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
14610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14620 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f  ex.zName      */
14630 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20  .      nExtra   
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
14660 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20   sequence names 
14670 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  */.  );.  if( db
14680 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14690 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
146a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
146b0 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  }.  pIndex->azCo
146c0 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70  ll = (char**)(&p
146d0 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e  Index[1]);.  pIn
146e0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
146f0 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d  (int *)(&pIndex-
14700 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a  >azColl[nCol]);.
14710 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45    pIndex->aiRowE
14720 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a  st = (unsigned *
14730 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  )(&pIndex->aiCol
14740 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  umn[nCol]);.  pI
14750 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
14760 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65   = (u8 *)(&pInde
14770 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c  x->aiRowEst[nCol
14780 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  +1]);.  pIndex->
14790 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  zName = (char *)
147a0 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  (&pIndex->aSortO
147b0 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a  rder[nCol]);.  z
147c0 45 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29  Extra = (char *)
147d0 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b  (&pIndex->zName[
147e0 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d  nName+1]);.  mem
147f0 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
14800 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
14810 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  1);.  pIndex->pT
14820 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
14830 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
14840 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
14850 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
14860 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
14870 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
14880 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65  dex = (u8)(pName
14890 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ==0);.  pIndex->
148a0 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
148b0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
148c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
148d0 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
148e0 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
148f0 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
14900 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
14910 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
14920 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
14930 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
14940 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
14950 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
14960 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
14970 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
14980 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
14990 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74    }..  /* Scan t
149a0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
149b0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
149c0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
149d0 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
149e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
149f0 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
14a00 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
14a10 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
14a20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
14a30 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
14a40 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
14a50 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
14a60 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
14a70 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
14a80 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a 20   not named.  ** 
14a90 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77  more than once w
14aa0 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69  ithin the same i
14ab0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
14ac0 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f  first instance o
14ad0 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  f.  ** the colum
14ae0 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75  n will ever be u
14af0 73 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d  sed by the optim
14b00 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74  izer.  Note that
14b10 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
14b20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65  same column more
14b30 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f   than once canno
14b40 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65  t be an error be
14b50 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
14b60 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63   .  ** break bac
14b70 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
14b80 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20  lity - it needs 
14b90 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e  to be a warning.
14ba0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
14bb0 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
14bc0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
14bd0 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
14be0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
14bf0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
14c00 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
14c10 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ame;.    Column 
14c20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e  *pTabCol;.    in
14c30 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
14c40 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
14c50 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
14c60 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
14c70 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14c80 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ame */..    for(
14c90 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
14ca0 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
14cb0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
14cc0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
14cd0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
14ce0 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
14cf0 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
14d00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14d10 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
14d20 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
14d30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14d40 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
14d50 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
14d60 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
14d70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
14d80 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
14d90 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14da0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
14db0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
14dc0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a 20 4a  i] = j;.    /* J
14dd0 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
14de0 74 68 65 20 41 4c 57 41 59 53 28 70 4c 69 73 74  the ALWAYS(pList
14df0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
14e00 6c 6c 29 3a 20 20 42 65 63 61 75 73 65 20 6f 66  ll):  Because of
14e10 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61 79 20  .    ** the way 
14e20 74 68 65 20 22 69 64 78 6c 69 73 74 22 20 6e 6f  the "idxlist" no
14e30 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20 63 6f  n-terminal is co
14e40 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
14e50 20 70 61 72 73 65 72 2c 0a 20 20 20 20 2a 2a 20   parser,.    ** 
14e60 69 66 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  if pListItem->pE
14e70 78 70 72 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  xpr is not null 
14e80 74 68 65 6e 20 65 69 74 68 65 72 20 70 4c 69 73  then either pLis
14e90 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
14ea0 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20  oll.    ** must 
14eb0 65 78 69 73 74 20 6f 72 20 65 6c 73 65 20 74 68  exist or else th
14ec0 65 72 65 20 6d 75 73 74 20 68 61 76 65 20 62 65  ere must have be
14ed0 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  en an OOM error.
14ee0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 0a 20    But if there. 
14ef0 20 20 20 2a 2a 20 77 61 73 20 61 6e 20 4f 4f 4d     ** was an OOM
14f00 20 65 72 72 6f 72 2c 20 77 65 20 77 6f 75 6c 64   error, we would
14f10 20 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 69   never reach thi
14f20 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  s point. */.    
14f30 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
14f40 45 78 70 72 20 26 26 20 41 4c 57 41 59 53 28 70  Expr && ALWAYS(p
14f50 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
14f60 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20  >pColl) ){.     
14f70 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
14f80 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
14f90 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
14fa0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
14fb0 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
14fc0 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
14fd0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
14fe0 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
14ff0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
15000 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
15010 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
15020 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
15030 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
15040 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
15050 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
15060 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  else{.      zCol
15070 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
15080 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ].zColl;.      i
15090 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !zColl ){.   
150a0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d       zColl = db-
150b0 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >pDfltColl->zNam
150c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
150d0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
150e0 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
150f0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
15100 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
15110 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
15120 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15130 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
15140 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
15150 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
15160 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
15170 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
15180 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
15190 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
151a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
151b0 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
151c0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73  rtOrder;.  }.  s
151d0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
151e0 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  Est(pIndex);..  
151f0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
15200 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
15210 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
15220 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
15230 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
15240 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
15250 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
15260 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
15270 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
15280 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
15290 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
152a0 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
152b0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
152c0 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
152d0 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
152e0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
152f0 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
15300 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
15310 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
15320 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
15330 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
15340 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
15350 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
15360 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
15370 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
15380 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
15390 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
153a0 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
153b0 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
153c0 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
153d0 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
153e0 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
153f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
15400 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
15410 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
15420 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
15430 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
15440 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
15450 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20    ** Two UNIQUE 
15460 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
15470 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
15480 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61  onsidered equiva
15490 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64  lent.    ** (and
154a0 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e   thus suppressin
154b0 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65  g the second one
154c0 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68  ) even if they h
154d0 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  ave different.  
154e0 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73    ** sort orders
154f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
15500 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
15510 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  ferent collating
15520 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66   sequences or if
15530 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   the columns of.
15540 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74      ** the const
15550 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64  raint occur in d
15560 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c  ifferent orders,
15570 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
15580 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  aints are.    **
15590 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
155a0 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65  inct and both re
155b0 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65  sult in separate
155c0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
155d0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
155e0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
155f0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
15600 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
15610 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
15620 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
15630 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
15640 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
15650 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
15660 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
15670 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
15680 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
15690 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
156a0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d   pIdx->nColumn!=
156b0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
156c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
156d0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
156e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  x->nColumn; k++)
156f0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
15700 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
15710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
15720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
15730 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21  dx->aiColumn[k]!
15740 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
15750 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n[k] ) break;.  
15760 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d        z1 = pIdx-
15770 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
15780 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d      z2 = pIndex-
15790 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
157a0 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26      if( z1!=z2 &
157b0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
157c0 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
157d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
157e0 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( k==pIdx->nCo
157f0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
15800 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
15810 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
15820 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
15830 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
15840 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
15850 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
15860 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
15870 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
15880 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
15890 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
158a0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
158b0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
158c0 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
158d0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
158e0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
158f0 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
15900 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
15910 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
15920 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
15930 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
15940 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
15950 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
15960 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
15970 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
15980 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
15990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
159a0 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
159b0 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20  d behaviour for 
159c0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
159d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
159e0 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
159f0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
15a00 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
15a10 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
15a20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
15a30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15a40 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
15a50 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
15a60 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
15a70 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
15a80 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
15a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15aa0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
15ab0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
15ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
15ad0 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
15ae0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
15af0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
15b10 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
15b20 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
15b30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
15b40 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
15b50 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
15b60 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
15b70 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
15b80 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
15b90 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
15ba0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
15bb0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
15bc0 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
15bd0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
15be0 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
15bf0 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
15c20 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
15c30 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e  len30(pIndex->zN
15c40 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
15c70 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
15c80 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
15c90 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
15ca0 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
15cb0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
15cc0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
15cd0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15ce0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
15cf0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
15d00 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
15d10 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
15d20 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
15d30 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
15d40 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
15d50 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
15d60 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
15d70 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
15d80 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
15d90 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
15da0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
15db0 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
15dc0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
15dd0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
15de0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
15df0 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
15e00 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
15e10 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
15e20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
15e30 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
15e40 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
15e50 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
15e60 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
15e70 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
15e80 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
15e90 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
15ea0 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
15eb0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
15ec0 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
15ed0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
15ee0 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
15ef0 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
15f00 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
15f10 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
15f20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
15f30 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
15f40 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
15f50 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
15f60 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
15f70 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
15f80 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
15f90 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
15fa0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
15fb0 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
15fc0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
15fd0 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
15fe0 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
15ff0 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
16000 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
16010 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
16020 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
16030 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
16040 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
16050 20 65 6c 73 65 7b 20 2f 2a 20 69 66 28 20 64 62   else{ /* if( db
16060 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
16070 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   */.    Vdbe *v;
16080 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
16090 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
160a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
160b0 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
160c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
160d0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
160e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
160f0 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
16100 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
16110 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
16120 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
16130 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16140 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
16150 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
16160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16170 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
16180 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
16190 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
161a0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
161b0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
161c0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
161d0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
161e0 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
161f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
16200 61 72 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  art ){.      ass
16210 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a  ert( pEnd!=0 );.
16220 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
16230 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
16240 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
16250 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
16260 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
16270 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
16280 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
16290 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
162a0 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
162b0 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
162c0 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e  UE",.        pEn
162d0 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20  d->z - pName->z 
162e0 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61  + 1,.        pNa
162f0 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
16300 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
16310 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
16320 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
16330 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
16340 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
16350 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
16360 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
16370 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
16380 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
16390 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
163a0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
163b0 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
163c0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
163d0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
163e0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
163f0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
16400 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
16410 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
16420 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
16430 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
16440 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
16450 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
16460 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
16470 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
16480 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20  .        iMem,. 
16490 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
164a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
164b0 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
164c0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
164d0 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
164e0 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
164f0 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
16500 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
16510 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
16520 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
16530 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
16540 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
16550 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
16560 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
16570 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
16580 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
16590 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
165a0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
165b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
165c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
165d0 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
165e0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
165f0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
16600 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22 2c  db, "name='%q'",
16610 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c   pIndex->zName),
16620 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
16630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16640 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp1(v, OP_Expi
16650 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  re, 0);.    }.  
16660 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
16670 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
16680 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
16690 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
166a0 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
166b0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
166c0 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
166d0 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
166e0 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
166f0 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
16700 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
16710 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
16720 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
16730 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
16740 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
16750 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
16760 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
16770 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
16780 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
16790 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
167a0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
167b0 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
167c0 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
167d0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
167e0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
167f0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
16800 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
16810 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
16820 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
16830 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
16840 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
16850 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
16860 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16870 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
16880 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
16890 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
168a0 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
168b0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
168c0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
168d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
168e0 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
168f0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
16900 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
16910 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
16920 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
16930 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
16940 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
16950 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
16960 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
16970 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
16980 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
16990 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
169a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
169b0 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Index->zColAff);
169c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
169d0 65 65 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ee(db, pIndex);.
169e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
169f0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
16a00 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
16a10 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
16a20 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
16a30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16a40 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
16a50 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  rn;.}../*.** Fil
16a60 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
16a70 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
16a80 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
16a90 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
16aa0 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
16ab0 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
16ac0 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
16ad0 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
16ae0 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
16af0 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74   suppose to cont
16b00 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
16b10 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
16b20 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
16b30 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
16b40 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
16b50 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
16b60 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
16b70 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
16b80 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
16b90 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
16ba0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
16bb0 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
16bc0 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
16bd0 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
16be0 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
16bf0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
16c00 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
16c10 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
16c20 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69  rticular combini
16c30 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
16c40 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
16c50 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
16c60 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
16c70 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
16c80 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
16c90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
16ca0 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
16cb0 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
16cc0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
16cd0 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
16ce0 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
16cf0 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
16d00 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
16d10 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
16d20 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
16d30 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
16d40 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
16d50 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
16d60 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
16d70 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
16d80 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
16d90 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
16da0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
16db0 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
16dc0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61  ){.  unsigned *a
16dd0 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
16de0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
16df0 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
16e00 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a  a[0] = 1000000;.
16e10 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43    for(i=pIdx->nC
16e20 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d  olumn; i>=5; i--
16e30 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b  ){.    a[i] = 5;
16e40 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e  .  }.  while( i>
16e50 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  =1 ){.    a[i] =
16e60 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d   11 - i;.    i--
16e70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
16e80 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
16e90 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
16ea0 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a  ->nColumn] = 1;.
16eb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
16ec0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
16ed0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
16ee0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
16ef0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
16f00 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
16f10 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
16f20 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
16f30 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
16f40 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
16f50 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
16f60 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
16f70 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
16f80 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
16f90 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16fa0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
16fb0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
16fc0 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
16fd0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
16fe0 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
16ff0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
17000 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
17010 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
17020 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
17030 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
17040 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
17050 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
17060 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
17070 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
17080 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
17090 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
170a0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
170b0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
170c0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
170d0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
170e0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
170f0 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
17100 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
17110 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17120 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
17130 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
17140 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
17150 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
17160 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
17170 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
17180 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
17190 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
171a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
171b0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
171c0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
171d0 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
171e0 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
171f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
17200 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
17210 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
17220 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
17230 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
17240 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
17250 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
17260 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
17270 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
17280 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
17290 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
172a0 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
172b0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
172c0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
172d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
172e0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
172f0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
17300 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
17310 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
17320 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
17330 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
17340 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
17350 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
17360 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
17370 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
17380 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
17390 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
173a0 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
173b0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
173c0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
173d0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
173e0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
173f0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
17400 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
17410 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17420 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
17430 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
17440 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17450 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
17460 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
17470 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
17480 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
17490 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
174a0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
174b0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
174c0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
174d0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
174e0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
174f0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
17500 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
17510 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  s WHERE name=%Q"
17520 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
17530 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
17540 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
17550 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
17560 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
17570 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
17580 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
17590 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62  _stat1", db->aDb
175a0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  [iDb].zName) ){.
175b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
175c0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
175d0 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
175e0 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
175f0 73 74 61 74 31 20 57 48 45 52 45 20 69 64 78 3d  stat1 WHERE idx=
17600 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  %Q",.        db-
17610 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
17620 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
17630 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
17640 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
17650 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
17660 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
17670 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
17680 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
17690 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
176a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
176b0 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
176c0 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
176d0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
176e0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
176f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
17700 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
17710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
17720 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
17730 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
17740 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a  jects.  Each obj
17750 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
17760 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
17770 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54  ytes in size.  T
17780 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
17790 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f  cates a new.** o
177a0 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64  bject on the end
177b0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   of the array..*
177c0 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73  *.** *pnEntry is
177d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
177e0 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20 69  ntries already i
177f0 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63  n use.  *pnAlloc
17800 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69   is.** the previ
17810 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
17820 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
17830 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
17840 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64  the.** suggested
17850 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73   initial array s
17860 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ize allocation..
17870 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
17880 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  of the new entry
17890 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
178a0 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  *pIdx..**.** Thi
178b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
178c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
178d0 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  he array of obje
178e0 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69  cts.  This.** mi
178f0 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
17900 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70 61  as the pArray pa
17910 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69  rameter or it mi
17920 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72 65  ght be a differe
17930 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66  nt.** pointer if
17940 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20 72   the array was r
17950 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  esized..*/.void 
17960 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c  *sqlite3ArrayAll
17970 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
17980 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f   *db,      /* Co
17990 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
179a0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
179b0 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
179c0 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20  *pArray,     /* 
179d0 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  Array of objects
179e0 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c  .  Might be real
179f0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
17a00 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f   szEntry,      /
17a10 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f  * Size of each o
17a20 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72  bject in the arr
17a30 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74  ay */.  int init
17a40 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67  Size,     /* Sug
17a50 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61  gested initial a
17a60 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
17a70 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
17a80 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
17a90 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
17aa0 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
17ab0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  use */.  int *pn
17ac0 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75  Alloc,     /* Cu
17ad0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
17ae0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  e allocation, in
17af0 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
17b00 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
17b10 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
17b20 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
17b30 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
17b40 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70  har *z;.  if( *p
17b50 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c  nEntry >= *pnAll
17b60 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  oc ){.    void *
17b70 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pNew;.    int ne
17b80 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69  wSize;.    newSi
17b90 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a  ze = (*pnAlloc)*
17ba0 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20  2 + initSize;.  
17bb0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
17bc0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
17bd0 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a  rray, newSize*sz
17be0 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20  Entry);.    if( 
17bf0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
17c00 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20   *pIdx = -1;.   
17c10 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79     return pArray
17c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41  ;.    }.    *pnA
17c30 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62  lloc = sqlite3Db
17c40 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
17c50 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20  New)/szEntry;.  
17c60 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
17c70 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
17c80 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
17c90 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a  et(&z[*pnEntry *
17ca0 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
17cb0 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
17cc0 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b  = *pnEntry;.  ++
17cd0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
17ce0 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
17cf0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
17d00 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
17d10 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
17d20 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
17d30 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
17d40 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
17d50 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
17d60 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
17d70 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
17d80 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
17d90 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
17da0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
17db0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
17dc0 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
17dd0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17de0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
17df0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
17e00 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
17e10 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
17e20 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
17e30 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
17e40 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
17e50 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
17e60 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
17e70 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
17e80 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
17e90 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
17ea0 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35  ->a[0]),.      5
17eb0 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
17ec0 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  nId,.      &pLis
17ed0 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  t->nAlloc,.     
17ee0 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
17ef0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
17f00 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
17f10 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
17f20 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
17f30 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
17f40 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
17f50 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
17f60 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  n);.  return pLi
17f70 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
17f80 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
17f90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
17fa0 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
17fb0 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
17fc0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
17fd0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17fe0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
17ff0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
18000 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
18010 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18020 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
18030 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18040 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
18050 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
18060 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
18070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18080 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
18090 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
180a0 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
180b0 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
180c0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
180d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
180e0 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
180f0 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
18100 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
18110 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
18120 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
18130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
18140 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
18150 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
18160 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
18170 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
18180 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
18190 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
181a0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20  }../*.** Expand 
181b0 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
181c0 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  ted for the give
181d0 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  n SrcList object
181e0 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20   by.** creating 
181f0 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73  nExtra new slots
18200 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   beginning at iS
18210 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73  tart.  iStart is
18220 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20   zero based..** 
18230 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65  New slots are ze
18240 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  roed..**.** For 
18250 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65  example, suppose
18260 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69   a SrcList initi
18270 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77  ally contains tw
18280 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a  o entries: A,B..
18290 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e  ** To append 3 n
182a0 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20  ew entries onto 
182b0 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73  the end, do this
182c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
182d0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
182e0 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33  (db, pSrclist, 3
182f0 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65  , 2);.**.** Afte
18300 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  r the call above
18310 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69   it would contai
18320 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e  n:  A, B, nil, n
18330 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74  il, nil..** If t
18340 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65  he iStart argume
18350 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e  nt had been 1 in
18360 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e  stead of 2, then
18370 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77   the result.** w
18380 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20  ould have been: 
18390 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   A, nil, nil, ni
183a0 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e  l, B.  To prepen
183b0 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c  d the new slots,
183c0 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76  .** the iStart v
183d0 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e  alue would be 0.
183e0 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65    The result the
183f0 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e  n would.** be: n
18400 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c  il, nil, nil, A,
18410 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d   B..**.** If a m
18420 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
18430 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69   fails the SrcLi
18440 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  st is unchanged.
18450 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c    The.** db->mal
18460 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77  locFailed flag w
18470 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72  ill be set to tr
18480 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ue..*/.SrcList *
18490 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
184a0 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33  large(.  sqlite3
184b0 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44   *db,       /* D
184c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
184d0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
184e0 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  OOM errors */.  
184f0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
18500 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73     /* The SrcLis
18510 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64  t to be enlarged
18520 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
18530 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
18540 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20  er of new slots 
18550 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e  to add to pSrc->
18560 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  a[] */.  int iSt
18570 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49  art         /* I
18580 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b  ndex in pSrc->a[
18590 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73  ] of first new s
185a0 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lot */.){.  int 
185b0 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  i;..  /* Sanity 
185c0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c  checking on call
185d0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
185e0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
185f0 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rt>=0 );.  asser
18600 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a  t( nExtra>=1 );.
18610 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
18620 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
18630 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72  Start<=pSrc->nSr
18640 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  c );..  /* Alloc
18650 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ate additional s
18660 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a  pace if needed *
18670 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  /.  if( pSrc->nS
18680 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e  rc+nExtra>pSrc->
18690 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
186a0 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
186b0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53   int nAlloc = pS
186c0 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b  rc->nSrc+nExtra;
186d0 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20  .    int nGot;. 
186e0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
186f0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
18700 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
18710 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63      sizeof(*pSrc
18720 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ) + (nAlloc-1)*s
18730 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
18740 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
18750 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  w==0 ){.      as
18760 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
18770 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
18780 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20  return pSrc;.   
18790 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e   }.    pSrc = pN
187a0 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28  ew;.    nGot = (
187b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
187c0 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20  ize(db, pNew) - 
187d0 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73  sizeof(*pSrc))/s
187e0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
187f0 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e  )+1;.    pSrc->n
18800 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f  Alloc = (u16)nGo
18810 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76  t;.  }..  /* Mov
18820 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73  e existing slots
18830 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72   that come after
18840 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
18850 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f  ted slots.  ** o
18860 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f  ut of the way */
18870 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e  .  for(i=pSrc->n
18880 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74  Src-1; i>=iStart
18890 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63  ; i--){.    pSrc
188a0 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20  ->a[i+nExtra] = 
188b0 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  pSrc->a[i];.  }.
188c0 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20    pSrc->nSrc += 
188d0 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20  (i16)nExtra;..  
188e0 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
188f0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
18900 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
18910 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
18920 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
18930 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
18940 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
18950 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
18960 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
18970 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
18980 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
18990 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
189a0 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
189b0 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
189c0 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
189d0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
189e0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
189f0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
18a00 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
18a10 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
18a20 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
18a30 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
18a40 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
18a50 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
18a60 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
18a70 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
18a80 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
18a90 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
18aa0 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  r.  The returned
18ab0 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
18ac0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
18ad0 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
18ae0 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
18af0 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
18b00 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
18b10 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
18b20 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
18b30 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
18b40 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
18b50 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
18b60 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
18b70 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
18b80 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
18b90 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
18ba0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
18bb0 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
18bc0 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
18bd0 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
18be0 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
18bf0 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
18c00 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
18c10 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
18c20 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
18c30 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
18c40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
18c50 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
18c60 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
18c70 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
18c80 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
18c90 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
18ca0 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
18cb0 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
18cc0 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
18cd0 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
18ce0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
18cf0 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
18d00 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
18d10 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
18d20 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
18d30 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
18d40 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
18d50 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
18d60 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
18d70 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
18d80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18d90 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
18da0 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
18db0 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
18dc0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
18dd0 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
18de0 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
18df0 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
18e00 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
18e10 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18e20 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
18e30 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
18e40 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
18e50 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
18e60 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
18e70 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
18e80 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
18e90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
18ea0 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
18eb0 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
18ec0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18ed0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
18ee0 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
18ef0 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
18f00 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
18f10 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
18f20 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
18f30 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
18f40 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
18f50 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
18f60 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
18f70 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
18f80 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18f90 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
18fa0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
18fb0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
18fc0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
18fd0 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
18fe0 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
18ff0 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
19000 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
19010 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
19020 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
19030 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
19040 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
19050 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
19060 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
19070 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19080 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19090 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61   assert( pDataba
190a0 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21  se==0 || pTable!
190b0 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  =0 );  /* Cannot
190c0 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20   have C without 
190d0 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74  B */.  if( pList
190e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
190f0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
19100 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
19110 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
19120 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
19130 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
19140 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
19150 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
19160 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
19170 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c  large(db, pList,
19180 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
19190 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
191a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
191b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
191c0 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
191d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
191e0 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
191f0 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
19200 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61  rc-1];.  if( pDa
19210 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
19220 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
19230 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
19240 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
19250 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ase ){.    Token
19260 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
19270 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
19280 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
19290 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
192a0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e  .  }.  pItem->zN
192b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
192c0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
192d0 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
192e0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
192f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
19300 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29  n(db, pDatabase)
19310 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
19320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
19330 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64  n VdbeCursor ind
19340 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c  ex numbers to al
19350 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
19360 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
19370 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
19380 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
19390 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
193a0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
193b0 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
193c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
193d0 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20  .  assert(pList 
193e0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
193f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
19400 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
19410 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
19420 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
19430 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
19440 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
19450 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
19460 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
19470 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
19480 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
19490 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
194a0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
194b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
194c0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
194d0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74  sors(pParse, pIt
194e0 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  em->pSelect->pSr
194f0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
19500 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
19510 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
19520 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
19530 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
19540 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
19550 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
19560 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
19570 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
19580 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
19590 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
195a0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
195b0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
195c0 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
195d0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
195e0 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
195f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19600 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19610 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
19620 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
19630 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
19640 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
19650 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19660 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
19670 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19680 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e  e(db, pItem->zIn
19690 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
196a0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 49 74  3DeleteTable(pIt
196b0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
196c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
196d0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
196e0 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
196f0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
19700 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
19710 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
19720 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
19730 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
19740 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19750 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
19760 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19770 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
19780 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
19790 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
197a0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
197b0 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
197c0 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
197d0 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
197e0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
197f0 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
19800 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
19810 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
19820 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
19830 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
19840 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
19850 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
19860 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
19870 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
19880 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
19890 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
198a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
198b0 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
198c0 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
198d0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
198e0 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
198f0 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
19900 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
19910 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20 61  the term has a a
19920 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
19930 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
19940 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
19950 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
19960 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
19970 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
19980 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
19990 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
199a0 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
199b0 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
199c0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
199d0 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
199e0 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
199f0 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
19a00 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
19a10 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
19a20 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
19a30 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
19a40 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
19a50 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
19a60 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
19a70 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
19a80 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
19a90 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
19aa0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
19ab0 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61  ndFromTerm(.  Pa
19ac0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19ad0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19ae0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
19af0 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
19b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
19b10 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
19b20 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
19b30 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
19b40 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
19b50 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
19b60 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
19b70 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
19b80 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
19b90 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
19ba0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
19bb0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
19bc0 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
19bd0 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
19be0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
19bf0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
19c00 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
19c10 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
19c20 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
19c30 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
19c40 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
19c50 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
19c60 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19c80 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
19c90 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
19ca0 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
19cb0 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
19cc0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
19cd0 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
19ce0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19cf0 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
19d00 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
19d10 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70  ;.  if( !p && (p
19d20 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b  On || pUsing) ){
19d30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19d40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
19d50 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72  JOIN clause is r
19d60 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25  equired before %
19d70 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20  s", .      (pOn 
19d80 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22  ? "ON" : "USING"
19d90 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74  ).    );.    got
19da0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
19db0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  ror;.  }.  p = s
19dc0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
19dd0 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
19de0 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
19df0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
19e00 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29  ER(p->nSrc==0) )
19e10 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
19e20 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
19e30 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
19e40 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
19e50 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
19e60 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
19e70 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
19e80 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
19e90 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
19ea0 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
19eb0 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
19ec0 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
19ed0 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
19ee0 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
19ef0 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
19f00 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
19f10 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
19f20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
19f30 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
19f40 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
19f50 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
19f60 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
19f70 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19f80 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
19f90 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
19fa0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
19fb0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
19fc0 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
19fd0 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
19fe0 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
19ff0 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
1a000 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
1a010 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1a020 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1a030 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1a040 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
1a050 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1a060 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
1a070 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
1a080 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
1a090 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
1a0a0 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72  && ALWAYS(p->nSr
1a0b0 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75  c>0) ){.    stru
1a0c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1a0d0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1a0e0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
1a0f0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f  ssert( pItem->no
1a100 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70  tIndexed==0 && p
1a110 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20  Item->zIndex==0 
1a120 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1a130 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
1a140 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
1a150 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
1a160 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
1a170 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
1a180 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
1a190 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
1a1a0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
1a1b0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1a1c0 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64     pItem->notInd
1a1d0 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
1a1e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
1a1f0 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->zIndex = sqlit
1a200 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a210 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
1a220 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
1a230 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1a240 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
1a250 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
1a260 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
1a270 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
1a280 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
1a290 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1a2a0 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
1a2b0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1a2c0 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
1a2d0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
1a2e0 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
1a2f0 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
1a300 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
1a310 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
1a320 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
1a330 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
1a340 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
1a350 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
1a360 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
1a370 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
1a380 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1a390 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
1a3a0 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
1a3b0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
1a3c0 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
1a3d0 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
1a3e0 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
1a3f0 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
1a400 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
1a410 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
1a420 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
1a430 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
1a440 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
1a450 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
1a460 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
1a470 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
1a480 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
1a490 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
1a4a0 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
1a4b0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26   *p){.  if( p &&
1a4c0 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74   p->a ){.    int
1a4d0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
1a4e0 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
1a4f0 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
1a500 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  ].jointype = p->
1a510 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b  a[i-1].jointype;
1a520 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b  .    }.    p->a[
1a530 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  0].jointype = 0;
1a540 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  .  }.}../*.** Be
1a550 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
1a560 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1a570 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
1a580 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
1a590 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
1a5a0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1a5b0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
1a5c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1a5d0 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
1a5e0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
1a5f0 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20  rt( db!=0 );./* 
1a600 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e   if( db->aDb[0].
1a610 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
1a620 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1a630 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1a640 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1a650 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
1a660 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1a670 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1a680 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a690 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
1a6a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1a6b0 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
1a6c0 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
1a6d0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1a6e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a700 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
1a710 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
1a720 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20  SIVE)+1);.      
1a730 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
1a740 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20  tree(v, i);.    
1a750 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
1a760 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a770 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  AutoCommit, 0, 0
1a780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1a790 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
1a7a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a7b0 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
1a7c0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1a7d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a7e0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1a7f0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1a800 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1a810 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
1a820 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66   db!=0 );./*  if
1a830 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  ( db->aDb[0].pBt
1a840 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f  ==0 ) return; */
1a850 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1a860 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1a870 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1a880 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
1a890 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1a8a0 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1a8b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1a8c0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1a8d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a8e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1a8f0 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20  Commit, 1, 0);. 
1a900 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c   }.}../*.** Roll
1a910 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1a920 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1a930 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61  e3RollbackTransa
1a940 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1a950 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
1a960 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1a970 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1a980 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
1a990 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
1a9a0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a  ert( db!=0 );./*
1a9b0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d    if( db->aDb[0]
1a9c0 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1a9d0 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ; */.  if( sqlit
1a9e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1a9f0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1aa00 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
1aa10 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  K", 0, 0) ){.   
1aa20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1aa30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1aa40 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1aa50 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1aa60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aa70 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1aa80 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
1aa90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1aaa0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1aab0 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
1aac0 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
1aad0 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
1aae0 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1aaf0 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
1ab00 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
1ab10 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
1ab20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1ab30 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
1ab40 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
1ab50 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1ab60 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1ab70 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
1ab80 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
1ab90 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
1aba0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1abb0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1abc0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1abd0 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
1abe0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 5d  const char *az[]
1abf0 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
1ac00 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
1ac10 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
1ac20 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
1ac30 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
1ac40 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
1ac50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1ac60 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
1ac70 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
1ac80 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ac90 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
1aca0 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
1acb0 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
1acc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1acd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1ace0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1acf0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
1ad00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1ad10 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
1ad20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
1ad30 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1ad40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1ad50 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
1ad60 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
1ad70 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
1ad80 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
1ad90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1ada0 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
1adb0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
1adc0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1add0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
1ade0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
1adf0 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
1ae00 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
1ae10 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ae20 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
1ae30 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
1ae40 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
1ae50 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1ae60 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1ae70 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
1ae80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1ae90 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1aea0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1aeb0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1aec0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1aed0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
1aee0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1aef0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1af00 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
1af10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1af20 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
1af30 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
1af40 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51  ory(db, 0, 0, SQ
1af50 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
1af60 48 45 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a  HE_SIZE, flags,.
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af90 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
1afa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1afb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1afc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1afd0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
1afe0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
1aff0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
1b000 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
1b010 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
1b020 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
1b030 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
1b040 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
1b050 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1b060 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61  assert( (db->fla
1b070 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
1b080 61 6e 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  ans)==0 || db->a
1b090 75 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20  utoCommit );.   
1b0a0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
1b0b0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
1b0c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a     sqlite3PagerJ
1b0d0 6f 75 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74  ournalMode(sqlit
1b0e0 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
1b0f0 3e 61 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[1].pBt),.  
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 64 66            db->df
1b120 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a  ltJournalMode);.
1b130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1b140 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b150 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1b160 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
1b170 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
1b180 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
1b190 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
1b1a0 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
1b1b0 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
1b1c0 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
1b1d0 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
1b1e0 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
1b1f0 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
1b200 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
1b210 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
1b220 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
1b230 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
1b240 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
1b250 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
1b260 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
1b270 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
1b280 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
1b290 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
1b2a0 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
1b2b0 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
1b2c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1b2d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b2e0 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
1b2f0 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
1b300 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
1b310 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
1b320 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
1b330 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
1b340 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
1b350 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
1b360 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
1b370 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
1b380 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
1b390 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
1b3a0 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
1b3b0 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
1b3c0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
1b3d0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
1b3e0 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
1b3f0 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
1b400 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
1b410 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
1b420 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
1b430 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
1b440 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
1b450 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
1b460 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
1b470 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
1b480 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
1b490 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
1b4a0 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
1b4b0 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
1b4c0 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
1b4d0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
1b4e0 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
1b4f0 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
1b500 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
1b510 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
1b520 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
1b530 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
1b540 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
1b550 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
1b560 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
1b570 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
1b580 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
1b590 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
1b5a0 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
1b5b0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
1b5c0 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
1b5d0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b5e0 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
1b5f0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1b600 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76    int mask;..  v
1b610 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b620 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1b630 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   v==0 ) return; 
1b640 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
1b650 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77  ppens if there w
1b660 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  as a prior error
1b670 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
1b680 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1b690 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  rse->cookieGoto=
1b6a0 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
1b6b0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73  ->cookieGoto = s
1b6c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b6d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1b6e0 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
1b6f0 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
1b700 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
1b710 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1b720 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1b730 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1b740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1b750 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1b760 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d  ACHED+2 );.    m
1b770 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
1b780 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
1b790 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
1b7a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
1b7b0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1b7c0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1b7d0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
1b7e0 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
1b7f0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1b800 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
1b810 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
1b820 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1b830 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b840 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
1b850 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ase(pParse);.   
1b860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1b870 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b880 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1b890 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
1b8a0 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
1b8b0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1b8c0 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
1b8d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1b8e0 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
1b8f0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
1b900 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
1b910 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
1b920 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
1b930 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
1b940 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
1b950 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
1b960 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
1b970 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
1b980 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
1b990 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
1b9a0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
1b9b0 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
1b9c0 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
1b9d0 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
1b9e0 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
1b9f0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
1ba00 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
1ba10 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
1ba20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
1ba30 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1ba40 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
1ba50 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
1ba60 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
1ba70 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
1ba80 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
1ba90 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
1baa0 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1bab0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
1bac0 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
1bad0 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
1bae0 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
1baf0 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
1bb00 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
1bb10 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
1bb20 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
1bb30 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
1bb40 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1bb50 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
1bb60 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
1bb70 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1bb80 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1bb90 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d    pParse->writeM
1bba0 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20  ask |= 1<<iDb;. 
1bbb0 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e   if( setStatemen
1bbc0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  t && pParse->nes
1bbd0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ted==0 ){.    /*
1bbe0 20 45 76 65 72 79 20 70 6c 61 63 65 20 77 68 65   Every place whe
1bbf0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1bc00 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 73  is called with s
1bc10 65 74 53 74 61 74 65 6d 65 6e 74 21 3d 30 20 68  etStatement!=0 h
1bc20 61 73 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  as.    ** alread
1bc30 79 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  y successfully c
1bc40 72 65 61 74 65 64 20 61 20 56 44 42 45 2e 20 2a  reated a VDBE. *
1bc50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1bc60 61 72 73 65 2d 3e 70 56 64 62 65 20 29 3b 0a 20  arse->pVdbe );. 
1bc70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bc80 64 4f 70 31 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp1(pParse->pVd
1bc90 62 65 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  be, OP_Statement
1bca0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , iDb);.  }.}../
1bcb0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
1bcc0 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
1bcd0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1bce0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1bcf0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
1bd00 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
1bd10 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
1bd20 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
1bd30 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1bd40 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
1bd50 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
1bd60 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
1bd70 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
1bd80 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1bd90 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
1bda0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
1bdb0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
1bdc0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1bdd0 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
1bde0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
1bdf0 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1be00 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
1be10 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c  StrICmp(z, zColl
1be20 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1be30 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1be40 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1be50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1be60 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1be70 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
1be80 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1be90 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
1bea0 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
1beb0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
1bec0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1bed0 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
1bee0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1bef0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1bf00 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
1bf10 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
1bf20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
1bf30 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
1bf40 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1bf50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1bf60 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1bf70 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1bf80 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1bf90 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1bfa0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1bfb0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1bfc0 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1bfd0 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1bfe0 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1bff0 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1c000 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1c010 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1c020 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1c030 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1c040 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1c050 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1c060 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1c070 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1c080 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1c090 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1c0a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1c0b0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1c0c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1c0d0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1c0e0 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1c0f0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1c100 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1c110 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1c120 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1c130 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1c140 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1c150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c160 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1c170 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1c180 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1c190 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1c1a0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1c1b0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1c1c0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1c1d0 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1c1e0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c200 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1c210 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1c220 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1c230 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1c240 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1c250 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1c260 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1c270 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1c280 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1c290 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1c2a0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1c2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1c2c0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1c2d0 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
1c2e0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1c2f0 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1c300 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1c310 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1c320 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1c330 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1c340 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1c350 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1c360 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1c370 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1c380 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1c390 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1c3a0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1c3b0 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1c3c0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1c3d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1c3e0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1c3f0 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1c400 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1c410 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1c440 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1c450 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1c460 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1c470 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1c480 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1c490 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1c4a0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1c4b0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1c4c0 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1c4d0 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1c4e0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1c4f0 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1c500 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1c510 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1c520 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1c530 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1c540 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1c550 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1c560 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1c570 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1c580 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1c590 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1c5a0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1c5b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1c5c0 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1c5d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c5e0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1c5f0 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1c600 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1c610 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1c620 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1c630 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1c640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1c650 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c660 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1c670 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1c680 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1c690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c6a0 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1c6b0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1c6c0 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1c6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1c6e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1c6f0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1c700 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1c710 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1c720 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1c730 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c750 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1c760 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1c770 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c790 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1c7a0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1c7b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c7c0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1c7d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1c7e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1c7f0 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1c800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1c810 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1c820 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1c830 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1c840 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1c850 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1c860 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1c870 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1c880 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1c890 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1c8a0 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1c8b0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1c8c0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1c8d0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1c8e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c8f0 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1c900 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1c910 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1c920 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1c930 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
1c940 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
1c950 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
1c960 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
1c970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1c980 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
1c990 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
1c9a0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1c9b0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
1c9c0 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1c9d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
1c9e0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1c9f0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1ca00 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
1ca10 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1ca20 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
1ca30 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1ca40 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
1ca50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ca60 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
1ca70 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1ca80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ca90 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
1caa0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1cab0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1cac0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1cad0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1cae0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1caf0 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1cb00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1cb10 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
1cb20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1cb30 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
1cb40 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1cb50 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1cb60 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
1cb70 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
1cb80 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
1cb90 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1cba0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
1cbb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1cbc0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1cbd0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1cbe0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1cbf0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1cc00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
1cc10 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1cc20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1cc30 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1cc40 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1cc50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
1cc60 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1cc70 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1cc80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1cc90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1cca0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1ccb0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1ccc0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
1ccd0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
1cce0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1ccf0 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c   a dynamicly all
1cd00 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73  ocated KeyInfo s
1cd10 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61  tructure that ca
1cd20 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
1cd30 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  h OP_OpenRead or
1cd40 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f   OP_OpenWrite to
1cd50 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
1cd60 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
1cd70 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1cd80 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
1cd90 68 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65  he new structure
1cda0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
1cdb0 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
1cdc0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1cdd0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1cde0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1cdf0 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72  e(db, ) on the r
1ce00 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1ce10 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1ce20 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1ce30 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1ce40 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1ce50 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1ce60 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1ce70 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1ce80 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1ce90 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1cea0 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1ceb0 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1cec0 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1ced0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1cee0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1cef0 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1cf00 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1cf10 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1cf20 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1cf30 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1cf40 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69  ) + nCol;.  sqli
1cf50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cf60 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
1cf70 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1cf80 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1cf90 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
1cfa0 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20  s);..  if( pKey 
1cfb0 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20  ){.    pKey->db 
1cfc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1cfd0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1cfe0 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1cff0 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1d000 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1d010 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1d020 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1d030 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1d040 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d050 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1d060 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1d070 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1d080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1d090 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1d0a0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1d0b0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1d0c0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1d0d0 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
1d0e0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1d0f0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1d100 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1d110 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Key->nField = (u
1d120 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20  16)nCol;.  }..  
1d130 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1d140 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1d150 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b  bFree(db, pKey);
1d160 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20  .    pKey = 0;. 
1d170 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
1d180 3b 0a 7d 0a                                      ;.}.