/ Hex Artifact Content
Login

Artifact f7da9f9a1df77d787965d0ff07d3de53c4ccade5:


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 50 61 72 73 65 20  d */.){.  Parse 
08b0: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
08c0: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
08d0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
08e0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
08f0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
0900: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
0910: 3d 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  =0 );..  for(i=0
0920: 3b 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e  ; i<pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  TableLock; i++){
0940: 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65  .    p = &pTople
0950: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b  vel->aTableLock[
0960: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  i];.    if( p->i
0970: 44 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54  Db==iDb && p->iT
0980: 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20  ab==iTab ){.    
0990: 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b    p->isWriteLock
09a0: 20 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f   = (p->isWriteLo
09b0: 63 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63  ck || isWriteLoc
09c0: 6b 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  k);.      return
09d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e  ;.    }.  }..  n
09e0: 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54  Bytes = sizeof(T
09f0: 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f  ableLock) * (pTo
0a00: 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f  plevel->nTableLo
0a10: 63 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76  ck+1);.  pToplev
0a20: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d  el->aTableLock =
0a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
0a40: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54  ReallocOrFree(pT
0a50: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f  oplevel->db, pTo
0a60: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0a70: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a80: 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54  f( pToplevel->aT
0a90: 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ableLock ){.    
0aa0: 70 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e  p = &pToplevel->
0ab0: 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c  aTableLock[pTopl
0ac0: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0ad0: 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20  ++];.    p->iDb 
0ae0: 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54  = iDb;.    p->iT
0af0: 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
0b00: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20  ->isWriteLock = 
0b10: 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20  isWriteLock;.   
0b20: 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d   p->zName = zNam
0b30: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
0b40: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0b50: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70  eLock = 0;.    p
0b60: 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61  Toplevel->db->ma
0b70: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
0b80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
0b90: 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  e an OP_TableLoc
0ba0: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  k instruction fo
0bb0: 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63  r each table loc
0bc0: 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ked by the.** st
0bd0: 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75  atement (configu
0be0: 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  red by calls to 
0bf0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0c00: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ())..*/.static v
0c10: 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  oid codeTableLoc
0c20: 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ks(Parse *pParse
0c30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0c40: 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70  be *pVdbe; ..  p
0c50: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Vdbe = sqlite3Ge
0c60: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
0c70: 20 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d   assert( pVdbe!=
0c80: 30 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47  0 ); /* sqlite3G
0c90: 65 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61  etVdbe cannot fa
0ca0: 69 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79  il: VDBE already
0cb0: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20   allocated */.. 
0cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
0cd0: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20  se->nTableLock; 
0ce0: 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c  i++){.    TableL
0cf0: 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65  ock *p = &pParse
0d00: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b  ->aTableLock[i];
0d10: 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d  .    int p1 = p-
0d20: 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
0d30: 33 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62  3VdbeAddOp4(pVdb
0d40: 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c  e, OP_TableLock,
0d50: 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d   p1, p->iTab, p-
0d60: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20  >isWriteLock,.  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34      p->zName, P4
0d90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a  _STATIC);.  }.}.
0da0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
0db0: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78  codeTableLocks(x
0dc0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0dd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0de0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73  called after a s
0df0: 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  ingle SQL statem
0e00: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e10: 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42  parsed and a VDB
0e20: 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65  E program to exe
0e30: 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  cute that statem
0e40: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e50: 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20  prepared.  This 
0e60: 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65  routine puts the
0e70: 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68   finishing touch
0e80: 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42  es on the.** VDB
0e90: 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65  E program and re
0ea0: 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20  sets the pParse 
0eb0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
0ec0: 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e  e next.** parse.
0ed0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
0ee0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
0ef0: 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20  urred, it might 
0f00: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
0f10: 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65  .** no VDBE code
0f20: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a   was generated..
0f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
0f40: 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73  inishCoding(Pars
0f50: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
0f60: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
0f70: 65 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50  e *v;..  db = pP
0f80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
0f90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0fc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0fd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
0fe0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67  eturn;..  /* Beg
0ff0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1000: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1010: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
1020: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
1030: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
1040: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1050: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1060: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
1070: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1080: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1090: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
10a0: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
10b0: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
10c0: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
10e0: 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  _Halt);..    /* 
10f0: 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20  The cookie mask 
1100: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74  contains one bit
1110: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1120: 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20  se file open..  
1130: 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66    ** (Bit 0 is f
1140: 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69  or main, bit 1 i
1150: 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20  s for temp, and 
1160: 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73  so forth.)  Bits
1170: 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20   are.    ** set 
1180: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
1190: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20  e that is used. 
11a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11b0: 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a  o start a.    **
11c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
11d0: 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61  each used databa
11e0: 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79  se and to verify
11f0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1200: 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63  ie.    ** on eac
1210: 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e  h used database.
1220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1230: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1240: 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33  to>0 ){.      u3
1250: 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e  2 mask;.      in
1260: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c  t iDb;.      sql
1270: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1280: 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  (v, pParse->cook
1290: 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20  ieGoto-1);.     
12a0: 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b   for(iDb=0, mask
12b0: 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =1; iDb<db->nDb;
12c0: 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b   mask<<=1, iDb++
12d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
12e0: 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63  mask & pParse->c
12f0: 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20  ookieMask)==0 ) 
1300: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1320: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
1330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1340: 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54  dbeAddOp2(v,OP_T
1350: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c  ransaction, iDb,
1360: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
1370: 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b  >writeMask)!=0);
1380: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
1390: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
13a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
13c0: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
13d0: 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  iDb, pParse->coo
13e0: 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a  kieValue[iDb]);.
13f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1400: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1410: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1420: 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  LE.      {.     
1430: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
1450: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20  rse->nVtabLock; 
1460: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1470: 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68  char *vtab = (ch
1480: 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
1490: 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65  Table(db, pParse
14a0: 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29  ->apVtabLock[i])
14b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14d0: 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30   OP_VBegin, 0, 0
14e0: 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54  , 0, vtab, P4_VT
14f0: 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  AB);.        }. 
1500: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
1510: 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  VtabLock = 0;.  
1520: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1530: 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20      /* Once all 
1540: 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65  the cookies have
1550: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61   been verified a
1560: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nd transactions 
1570: 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a  opened, .      *
1580: 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  * obtain the req
1590: 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b  uired table-lock
15a0: 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  s. This is a no-
15b0: 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20  op unless the . 
15c0: 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63       ** shared-c
15d0: 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
15e0: 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a  enabled..      *
15f0: 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c  /.      codeTabl
1600: 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a  eLocks(pParse);.
1610: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
1620: 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43  lize any AUTOINC
1630: 52 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75  REMENT data stru
1640: 63 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e  ctures required.
1650: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1660: 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65  sqlite3Autoincre
1670: 6d 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65  mentBegin(pParse
1680: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  );..      /* Fin
1690: 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20  ally, jump back 
16a0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
16b0: 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62   of the executab
16c0: 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  le code. */.    
16d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16e0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
16f0: 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  0, pParse->cooki
1700: 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  eGoto);.    }.  
1710: 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  }...  /* Get the
1720: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
1730: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
1740: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
1750: 26 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d  & ALWAYS(pParse-
1760: 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64 62  >nErr==0) && !db
1770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1780: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1790: 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a  DEBUG.    FILE *
17a0: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
17b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
17c0: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
17d0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
17e0: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
17f0: 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20  trace);.#endif. 
1800: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1810: 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
1820: 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  0 );  /* Disable
1830: 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73  s and re-enables
1840: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71   match */.    sq
1850: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1860: 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56  dy(v, pParse->nV
1870: 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ar, pParse->nMem
1880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1890: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
18a0: 65 2d 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d  e->nTab, pParse-
18b0: 3e 6e 4d 61 78 41 72 67 2c 20 70 50 61 72 73 65  >nMaxArg, pParse
18c0: 2d 3e 65 78 70 6c 61 69 6e 2c 0a 20 20 20 20 20  ->explain,.     
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 73 4d 75      pParse->isMu
18f0: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
1900: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
1910: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1920: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1930: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
1940: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
1950: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63  e if( pParse->rc
1960: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1970: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1980: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1990: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
19a0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
19b0: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
19c0: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
19d0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
19e0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
19f0: 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  ieMask = 0;.  pP
1a00: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1a10: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
1a20: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1a30: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1a40: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1a50: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1a60: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1a70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1a80: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
1a90: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1aa0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1ab0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1ac0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1ad0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1ae0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1af0: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1b00: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1b10: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1b20: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1b30: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1b40: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1b50: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1b60: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1b70: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1b80: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1b90: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1ba0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1bb0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1bc0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1bd0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1be0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1bf0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
1c00: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
1c10: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
1c20: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
1c30: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
1c40: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
1c50: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
1c60: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
1c70: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1c80: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
1c90: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1ca0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
1cb0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
1cc0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
1cd0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
1ce0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1cf0: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66  Parse->db;.# def
1d00: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
1d10: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
1d20: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
1d30: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
1d40: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
1d50: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1d60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
1d70: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
1d80: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
1d90: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
1da0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
1db0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
1dc0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1dd0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
1de0: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
1df0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
1e00: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
1e10: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
1e20: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
1e30: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
1e40: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
1e50: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
1e60: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
1e70: 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61  uf, &pParse->nVa
1e80: 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d  r, SAVE_SZ);.  m
1e90: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e  emset(&pParse->n
1ea0: 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29  Var, 0, SAVE_SZ)
1eb0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61  ;.  sqlite3RunPa
1ec0: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
1ed0: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
1ee0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ef0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
1f00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f10: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
1f20: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
1f30: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
1f40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
1f50: 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ed--;.}../*.** L
1f60: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1f70: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
1f80: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
1f90: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1fa0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
1fb0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1fc0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1fd0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1fe0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1ff0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2000: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2010: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2020: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2030: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2040: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2050: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2060: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
2070: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
2080: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
2090: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
20a0: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
20b0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
20c0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
20d0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
20e0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
20f0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
2100: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2110: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2120: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2130: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2140: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2150: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2160: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2170: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
2180: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2190: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
21a0: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
21b0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
21c0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e   int i;.  int nN
21d0: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ame;.  assert( z
21e0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61  Name!=0 );.  nNa
21f0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2200: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  en30(zName);.  f
2210: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2220: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2230: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2240: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2250: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2260: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2270: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2280: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2290: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
22a0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
22b0: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
22c0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
22d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
22e0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
22f0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
2300: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2310: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2320: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2330: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2340: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2350: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2360: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2370: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2380: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2390: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
23a0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
23b0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
23c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
23d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
23e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
23f0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2400: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2410: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2420: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2430: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2440: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2450: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2460: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2470: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2480: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2490: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
24a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
24b0: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
24c0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
24d0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
24e0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
24f0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2500: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2510: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2520: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2530: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2540: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2550: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2560: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2570: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2580: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2590: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
25a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
25b0: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
25c0: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
25d0: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
25e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
25f0: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2600: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2610: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2620: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2630: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2640: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2650: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2660: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2670: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2680: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2690: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
26a0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
26b0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
26c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
26d0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
26e0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
26f0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2700: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2710: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2720: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2730: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2740: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2750: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2760: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2770: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2780: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2790: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
27a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
27b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
27c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27d0: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
27e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
27f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
2800: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
2810: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2820: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2830: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2840: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2850: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2860: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2870: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2880: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2890: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
28a0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
28b0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
28c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
28d0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
28e0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
28f0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2900: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2910: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2920: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2930: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2940: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2950: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2960: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2970: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2980: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2990: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
29a0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
29b0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
29c0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
29d0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
29e0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
29f0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2a00: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2a10: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2a20: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2a30: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2a40: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2a50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2a60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2a70: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  en30(zName);.  f
2a80: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2a90: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2aa0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2ab0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2ac0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
2ad0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
2ae0: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
2af0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ma = db->aDb[j].
2b00: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
2b10: 65 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a  ert( pSchema );.
2b20: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
2b30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
2b40: 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  b, db->aDb[j].zN
2b50: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
2b60: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
2b70: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
2b80: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
2b90: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
2ba0: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
2bb0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2bc0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
2bd0: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
2be0: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
2bf0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
2c00: 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20  dex(Index *p){. 
2c10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2c20: 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b  ->pTable->dbMem;
2c30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c40: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
2c50: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
2c60: 78 53 61 6d 70 6c 65 73 28 70 29 3b 0a 23 65 6e  xSamples(p);.#en
2c70: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
2c80: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41  ree(db, p->zColA
2c90: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ff);.  sqlite3Db
2ca0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
2cb0: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2cc0: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
2cd0: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
2ce0: 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65   table, and free
2cf0: 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73  .** its memory s
2d00: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a  tructures..**.**
2d10: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65   The index is re
2d20: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64  moved from the d
2d30: 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62  atabase hash tab
2d40: 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73  les but.** it is
2d50: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72   not unlinked fr
2d60: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61  om the Table tha
2d70: 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a  t it indexes..**
2d80: 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20   Unlinking from 
2d90: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
2da0: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
2db0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2dc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2dd0: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
2de0: 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49  x(Index *p){.  I
2df0: 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f  ndex *pOld;.  co
2e00: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2e10: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70  = p->zName;..  p
2e20: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
2e30: 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
2e40: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
2e50: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e80: 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 61 73  zName), 0);.  as
2e90: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c  sert( pOld==0 ||
2ea0: 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72   pOld==p );.  fr
2eb0: 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f  eeIndex(p);.}../
2ec0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64  *.** For the ind
2ed0: 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61  ex called zIdxNa
2ee0: 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e  me which is foun
2ef0: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2f00: 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65  e iDb,.** unlike
2f10: 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d   that index from
2f20: 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20   its Table then 
2f30: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
2f40: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64   from.** the ind
2f50: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
2f60: 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  d free all memor
2f70: 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  y structures ass
2f80: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
2f90: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  the index..*/.vo
2fa0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
2fb0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
2fc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2fd0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
2fe0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
2ff0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69  dex *pIndex;.  i
3000: 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a  nt len;.  Hash *
3010: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62  pHash = &db->aDb
3020: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
3030: 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d  dxHash;..  len =
3040: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
3050: 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49  (zIdxName);.  pI
3060: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61  ndex = sqlite3Ha
3070: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
3080: 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30  zIdxName, len, 0
3090: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
30a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
30b0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
30c0: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
30d0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
30e0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
30f0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
3100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
3110: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
3120: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
3130: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
3140: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
3150: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
3160: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
3170: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
3180: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3190: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
31a0: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
31b0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
31c0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
31d0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
31e0: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
31f0: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
3200: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
3210: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3220: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3230: 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
3240: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
3250: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
3260: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3270: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
3280: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
3290: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
32a0: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
32b0: 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20   of.** a single 
32c0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
32d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
32e0: 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d  d to reclaim mem
32f0: 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68  ory.** before th
3300: 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65  e database close
3310: 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63  s.  It is also c
3320: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72  alled during a r
3330: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68  ollback.** if th
3340: 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20  ere were schema 
3350: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
3360: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
3370: 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61  r if a.** schema
3380: 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68  -cookie mismatch
3390: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   occurs..**.** I
33a0: 66 20 69 44 62 3d 3d 30 20 74 68 65 6e 20 72 65  f iDb==0 then re
33b0: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
33c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66   schema tables f
33d0: 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
33e0: 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44  ** files.  If iD
33f0: 62 3e 3d 31 20 74 68 65 6e 20 72 65 73 65 74 20  b>=1 then reset 
3400: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
3410: 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65  ema for only the
3420: 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  .** single file 
3430: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f  indicated..*/.vo
3440: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  id sqlite3ResetI
3450: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71  nternalSchema(sq
3460: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
3470: 44 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Db){.  int i, j;
3480: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
3490: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
34a0: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3d 3d   );..  if( iDb==
34b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
34c0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
34d0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69  );.  }.  for(i=i
34e0: 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  Db; i<db->nDb; i
34f0: 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
3500: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3510: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
3520: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 61 73  hema ){.      as
3530: 73 65 72 74 28 69 3d 3d 31 20 7c 7c 20 28 70 44  sert(i==1 || (pD
3540: 62 2d 3e 70 42 74 20 26 26 20 73 71 6c 69 74 65  b->pBt && sqlite
3550: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3560: 28 70 44 62 2d 3e 70 42 74 29 29 29 3b 0a 20 20  (pDb->pBt)));.  
3570: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3580: 61 46 72 65 65 28 70 44 62 2d 3e 70 53 63 68 65  aFree(pDb->pSche
3590: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ma);.    }.    i
35a0: 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72  f( iDb>0 ) retur
35b0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
35c0: 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d   iDb==0 );.  db-
35d0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
35e0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
35f0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
3600: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
3610: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
3620: 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
3630: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  If one or more o
3640: 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  f the auxiliary 
3650: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
3660: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a  as been closed,.
3670: 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65    ** then remove
3680: 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61   them from the a
3690: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
36a0: 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65  e list.  We take
36b0: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74   the.  ** opport
36c0: 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73  unity to do this
36d0: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68   here since we h
36e0: 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64  ave just deleted
36f0: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a   all of the.  **
3700: 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62   schema hash tab
3710: 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72  les and therefor
3720: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
3730: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
3740: 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66  s.  ** to any of
3750: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
3760: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b   */.  for(i=j=2;
3770: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3780: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
3790: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
37a0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
37b0: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
37c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
37d0: 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  b, pDb->zName);.
37e0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
37f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
3800: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
3810: 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20  if( j<i ){.     
3820: 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62   db->aDb[j] = db
3830: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aDb[i];.    }.
3840: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d      j++;.  }.  m
3850: 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a  emset(&db->aDb[j
3860: 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a  ], 0, (db->nDb-j
3870: 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  )*sizeof(db->aDb
3880: 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62  [j]));.  db->nDb
3890: 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e   = j;.  if( db->
38a0: 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44  nDb<=2 && db->aD
38b0: 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b!=db->aDbStatic
38c0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64   ){.    memcpy(d
38d0: 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62  b->aDbStatic, db
38e0: 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28  ->aDb, 2*sizeof(
38f0: 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20  db->aDb[0]));.  
3900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3910: 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20  db, db->aDb);.  
3920: 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
3930: 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d  aDbStatic;.  }.}
3940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3950: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3960: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
3970: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
3980: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
3990: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
39a0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
39b0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
39c0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
39d0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
39e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
39f0: 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  om a table or vi
3a00: 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ew..*/.static vo
3a10: 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  id sqliteResetCo
3a20: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
3a30: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
3a40: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
3a50: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
3a60: 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d   = pTable->dbMem
3a70: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 64 62  ;.  testcase( db
3a80: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
3a90: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
3aa0: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
3ab0: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
3ac0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3ad0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
3ae0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
3af0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3b00: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
3b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3b20: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
3b30: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
3b40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3b50: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
3b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3b70: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3b80: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Type);.      sql
3b90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3ba0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
3bb0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
3bc0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
3bd0: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54  >aCol);.  }.  pT
3be0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
3bf0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
3c00: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   0;.}../*.** Rem
3c10: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
3c20: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
3c30: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3c40: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
3c50: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
3c60: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
3c70: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
3c80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3c90: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
3ca0: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
3cb0: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
3cc0: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
3cd0: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
3ce0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
3cf0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
3d00: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
3d10: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
3d20: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
3d30: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
3d40: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
3d50: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
3d60: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3d70: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 54 61  e3DeleteTable(Ta
3d80: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3d90: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
3da0: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
3db0: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
3dc0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
3dd0: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
3de0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  0 ) return;.  db
3df0: 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d   = pTable->dbMem
3e00: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 64 62  ;.  testcase( db
3e10: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  ==0 );..  /* Do 
3e20: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
3e30: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
3e40: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
3e50: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
3e60: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d    pTable->nRef--
3e70: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  ;.  if( pTable->
3e80: 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65  nRef>0 ){.    re
3e90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
3ea0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  rt( pTable->nRef
3eb0: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  ==0 );..  /* Del
3ec0: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
3ed0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3ee0: 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  this table.  */.
3ef0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
3f00: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
3f10: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
3f20: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
3f30: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3f40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
3f50: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
3f60: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b  able->pSchema );
3f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
3f80: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3f90: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3fb0: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3fc0: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3fd0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3fe0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
3ff0: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
4000: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
4010: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
4020: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
4030: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
4040: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 73 71 6c 69  xtFrom;.    sqli
4050: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
4060: 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Key);.  }.#endif
4070: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
4080: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
4090: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
40a0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
40b0: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b  mnNames(pTable);
40c0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
40d0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
40e0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
40f0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4100: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
4110: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4120: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
4130: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
4140: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
4150: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4160: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
4170: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
4180: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
4190: 65 61 72 28 70 54 61 62 6c 65 29 3b 0a 20 20 73  ear(pTable);.  s
41a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
41b0: 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a   pTable);.}../*.
41c0: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
41d0: 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ven table from t
41e0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  he hash tables a
41f0: 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68  nd the delete th
4200: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63  e.** table struc
4210: 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74  ture with all it
4220: 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  s indices and fo
4230: 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76  reign keys..*/.v
4240: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
4250: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
4260: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4270: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
4280: 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54   *zTabName){.  T
4290: 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70  able *p;.  Db *p
42a0: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
42b0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
42c0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
42d0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
42e0: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26  ert( zTabName &&
42f0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a   zTabName[0] );.
4300: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4310: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
4320: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4330: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
4340: 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c  lHash, zTabName,
4350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4360: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4370: 53 74 72 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d  Strlen30(zTabNam
4380: 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e),0);.  sqlite3
4390: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29 3b 0a  DeleteTable(p);.
43a0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
43b0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
43c0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
43d0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
43e0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
43f0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
4400: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
4410: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
4420: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
4430: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4440: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4450: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
4460: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
4470: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
4480: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
4490: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
44a0: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
44b0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
44c0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
44d0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
44e0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
44f0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
4500: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
4510: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
4520: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
4530: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
4540: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
4550: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
4560: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
4570: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
4580: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
4590: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
45a0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
45b0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
45c0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
45d0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
45e0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
45f0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
4600: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
4610: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
4620: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
4630: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
4640: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
4650: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
4660: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
4670: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
4680: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
4690: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
46a0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
46b0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
46c0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
46d0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
46e0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
46f0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
4700: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
4710: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
4720: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
4730: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
4740: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
4750: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
4760: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
4770: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
4780: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48  TER_ROOT, 1, SCH
4790: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
47a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
47b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
47c0: 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f  rite, 0, MASTER_
47d0: 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20 73 71  ROOT, iDb);.  sq
47e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
47f0: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
4800: 29 35 2c 20 50 34 5f 49 4e 54 33 32 29 3b 20 20  )5, P4_INT32);  
4810: 2f 2a 20 35 20 63 6f 6c 75 6d 6e 20 74 61 62 6c  /* 5 column tabl
4820: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 54  e */.  if( p->nT
4830: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ab==0 ){.    p->
4840: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  nTab = 1;.  }.}.
4850: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
4860: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
4870: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
4880: 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  d buffer contain
4890: 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ing the name.** 
48a0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22  of a database ("
48b0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72  main", "temp" or
48c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
48d0: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
48e0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
48f0: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78  eturns the index
4900: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
4910: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
4920: 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66  b[], or.** -1 if
4930: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61   the named db ca
4940: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
4950: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
4960: 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  dDbName(sqlite3 
4970: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
4980: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
4990: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
49a0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
49b0: 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65  r */.  if( zName
49c0: 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b   ){.    Db *pDb;
49d0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c  .    int n = sql
49e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
49f0: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  me);.    for(i=(
4a00: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
4a10: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
4a20: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
4a30: 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54        if( (!OMIT
4a40: 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20  _TEMPDB || i!=1 
4a50: 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53  ) && n==sqlite3S
4a60: 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61  trlen30(pDb->zNa
4a70: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4a80: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
4a90: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
4aa0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
4ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4ad0: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
4ae0: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
4af0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
4b00: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
4b10: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
4b20: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
4b30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
4b40: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
4b50: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
4b60: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
4b70: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
4b80: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
4b90: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
4ba0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
4bb0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
4bc0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
4bd0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
4be0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4bf0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4c20: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
4c30: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
4c60: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
4c70: 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
4c80: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4c90: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
4ca0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
4cb0: 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Name(db, zName);
4cc0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4cd0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
4ce0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
4cf0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4d00: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
4d10: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
4d20: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
4d30: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
4d40: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
4d50: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
4d60: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
4d70: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
4d80: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
4d90: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
4da0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
4db0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4dc0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
4dd0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
4de0: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
4df0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
4e00: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
4e10: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
4e20: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
4e30: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
4e40: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4e50: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
4e60: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
4e70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4e80: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
4e90: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
4ea0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
4eb0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
4ec0: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
4ed0: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
4ee0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
4ef0: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
4f00: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
4f10: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
4f20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
4f30: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
4f40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4f50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
4f60: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
4f70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
4f80: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
4f90: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
4fa0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
4fb0: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
4fc0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
4fd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
4fe0: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
4ff0: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
5000: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
5010: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
5020: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
5030: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
5040: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
5070: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
5080: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5090: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
50a0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61 6d   if( ALWAYS(pNam
50b0: 65 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65 32  e2!=0) && pName2
50c0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
50d0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
50e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
50f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5100: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
5110: 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  se");.      pPar
5120: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5130: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5140: 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20   }.    *pUnqual 
5150: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
5160: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
5170: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
5180: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
5190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
51a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
51b0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
51c0: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
51d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
51e0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
51f0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
5200: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5210: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
5220: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
5230: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
5240: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
5250: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
5260: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
5270: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
5280: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5290: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
52a0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
52b0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
52c0: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
52d0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
52e0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
52f0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
5300: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
5310: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
5320: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
5330: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
5340: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
5350: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
5360: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
5370: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
5380: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
5390: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
53a0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
53b0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
53c0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
53d0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
53e0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
53f0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
5400: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
5410: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
5420: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
5430: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
5440: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5450: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
5460: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
5470: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
5480: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
5490: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
54a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
54b0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
54c0: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
54d0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
54e0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
54f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5500: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
5510: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
5530: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
5540: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
5550: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
5560: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
5570: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
5580: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
5590: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
55a0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
55b0: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
55c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
55d0: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
55e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
55f0: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
5600: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
5610: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
5620: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
5630: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
5640: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
5650: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
5660: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
5670: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
5680: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
5690: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
56a0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
56b0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
56c0: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
56d0: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
56e0: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
56f0: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
5700: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
5710: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
5720: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
5730: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
5740: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
5750: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
5760: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
5770: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
5780: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5790: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
57a0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
57b0: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
57c0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
57d0: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
57e0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
57f0: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
5800: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
5810: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5820: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
5830: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
5840: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
5850: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
5860: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
5870: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
5880: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
5890: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
58a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
58b0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
58c0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
58d0: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
58e0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
58f0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5900: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
5910: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
5920: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
5930: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5940: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
5950: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
5960: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5970: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
5980: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
5990: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
59a0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
59b0: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
59c0: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
59d0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
59e0: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
59f0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
5a00: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
5a10: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
5a20: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
5a30: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
5a40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5a50: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
5a60: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5a70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5a80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5a90: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5aa0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
5ab0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5ac0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
5ad0: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
5ae0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
5af0: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
5b00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
5b10: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
5b20: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
5b30: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
5b40: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
5b60: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
5b70: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5b80: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
5b90: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
5ba0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
5bb0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
5bc0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5bd0: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
5be0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5bf0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5c00: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5c10: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5c20: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
5c30: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5c40: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5c50: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
5c60: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5c70: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
5c80: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5c90: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5ca0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5cb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5cc0: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
5cd0: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
5ce0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5cf0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5d00: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
5d10: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5d20: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5d30: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
5d40: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
5d50: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
5d60: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
5d70: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
5d80: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
5d90: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
5da0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
5db0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5dc0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
5dd0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
5de0: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
5df0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5e00: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5e10: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
5e20: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
5e30: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
5e40: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
5e50: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
5e60: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
5e70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5e80: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
5e90: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
5ea0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
5eb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5ec0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5ed0: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
5ee0: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5ef0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5f00: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5f10: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5f20: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5f30: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5f50: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5f60: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5f70: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5f80: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5f90: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5fa0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5fb0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5fc0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5fd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5fe0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
5ff0: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
6000: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
6010: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
6020: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
6030: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
6040: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6050: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6060: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6070: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6080: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
6090: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
60a0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
60b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
60c0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
60d0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
60e0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
60f0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6100: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6110: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
6120: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6130: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6140: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6150: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6160: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6170: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6180: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
6190: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
61a0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
61b0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
61c0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
61d0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
61e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
61f0: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6200: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6210: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6220: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6230: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6240: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6250: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6260: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6270: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6280: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
6290: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
62a0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
62b0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
62c0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
62d0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
62e0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
62f0: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6300: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6310: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6320: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6330: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6340: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6350: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6360: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6370: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6380: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
6390: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
63a0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
63b0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
63c0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
63d0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
63e0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
63f0: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
6400: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6410: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6420: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6430: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
6450: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
6460: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
6470: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6480: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  me);.    if( pTa
6490: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
64a0: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
64b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
64c0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
64d0: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
64e0: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
64f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
6500: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6510: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6520: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
6530: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
6540: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
6550: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
6560: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
6570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6580: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
6590: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
65a0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
65b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
65c0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
65d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
65e0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
65f0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6600: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
6610: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
6620: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
6630: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
6640: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
6650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
6660: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
6670: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6680: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
6690: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
66a0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
66b0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
66c0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
66d0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
66e0: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
66f0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
6700: 6c 65 2d 3e 64 62 4d 65 6d 20 3d 20 30 3b 0a 20  le->dbMem = 0;. 
6710: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
6720: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
6730: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
6740: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
6750: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6760: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
6770: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
6780: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
6790: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
67a0: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
67b0: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
67c0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
67d0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
67e0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
67f0: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
6800: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
6810: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6820: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
6830: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
6840: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
6850: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
6860: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
6870: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 ){.    pTable-
6880: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
6890: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
68a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
68b0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
68c0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
68d0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
68e0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
68f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
6900: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
6910: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6920: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6930: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6940: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6950: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6960: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6970: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6980: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
6990: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
69a0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
69b0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
69c0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
69d0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
69e0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
69f0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
6a00: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
6a10: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6a20: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6a30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6a40: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6a50: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6a60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6a70: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6a80: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6a90: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
6aa0: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
6ab0: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
6ac0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
6ad0: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
6ae0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
6af0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6b00: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
6b10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6b20: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6b30: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
6b40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6b50: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6b60: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
6b70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
6b80: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
6b90: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6ba0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6bb0: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
6bc0: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
6bd0: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
6be0: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
6bf0: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
6c00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6c10: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
6c20: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
6c30: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6c40: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
6c50: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
6c60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6c70: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
6c80: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
6c90: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
6ca0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
6cb0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
6cc0: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
6cd0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
6ce0: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
6cf0: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
6d00: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
6d10: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
6d20: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
6d30: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
6d40: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
6d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6d60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6d70: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
6d80: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
6d90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6da0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6db0: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
6dc0: 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20  FORMAT, reg3);. 
6dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6de0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6df0: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
6e00: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6e10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6e20: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6e30: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
6e40: 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  ING, reg3);.    
6e50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6e60: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
6e70: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
6e80: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
6e90: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
6ea0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6eb0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
6ec0: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
6ed0: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
6ee0: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
6ef0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
6f00: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
6f10: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
6f20: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
6f30: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6f40: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
6f50: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
6f60: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
6f70: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
6f80: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
6f90: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
6fa0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
6fb0: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
6fc0: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
6fd0: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
6fe0: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
6ff0: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
7000: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
7010: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
7020: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
7030: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
7040: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
7050: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
7060: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7070: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
7080: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7090: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
70a0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
70b0: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
70c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
70d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
70e0: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
70f0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
7100: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
7110: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7120: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
7130: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
7140: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
7150: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
7160: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7180: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7190: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
71a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
71b0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
71c0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
71d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
71e0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
71f0: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
7200: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7210: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7220: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
7230: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
7240: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
7250: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
7260: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
7270: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
7280: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
7290: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
72a0: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
72b0: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
72c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
72d0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
72e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
72f0: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
7300: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
7310: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
7320: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
7330: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
7340: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
7350: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
7360: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
7370: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
7380: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
7390: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
73a0: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
73b0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
73c0: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
73d0: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
73e0: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
73f0: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
7400: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
7410: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
7420: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
7430: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
7440: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
7450: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
7460: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
7470: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7480: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
7490: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
74a0: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
74b0: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
74c0: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
74d0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
74e0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
74f0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
7500: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
7510: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
7520: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7530: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
7540: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
7550: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7560: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
7570: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
7580: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
7590: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
75a0: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
75b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
75c0: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
75d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
75e0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
75f0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
7600: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
7610: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
7620: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
7630: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
7640: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7650: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
7660: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7670: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
7680: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
7690: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  UMN.  if( p->nCo
76a0: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
76b0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
76c0: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
76d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
76e0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
76f0: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
7700: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
7710: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
7720: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
7730: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
7740: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
7750: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7760: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
7770: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
7780: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
7790: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
77a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
77b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
77c0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
77d0: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
77e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
77f0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7800: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7810: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7820: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
7830: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
7840: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7850: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
7860: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
7870: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
7880: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
7890: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
78a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
78b0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
78c0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
78d0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
78e0: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
78f0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
7900: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
7910: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
7920: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
7930: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
7940: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
7950: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
7960: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
7970: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
7980: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
7990: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
79a0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
79b0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
79c0: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
79d0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
79e0: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
79f0: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
7a00: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
7a10: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7a20: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  _AFF_NONE;.  p->
7a30: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
7a40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7a50: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7a60: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7a70: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7a80: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7a90: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7aa0: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
7ab0: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
7ac0: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
7ad0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
7ae0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7af0: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
7b00: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
7b10: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7b20: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7b30: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
7b40: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
7b50: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
7b60: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7b70: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7b80: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7b90: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
7ba0: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
7bb0: 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  .  p->aCol[p->nC
7bc0: 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol-1].notNull = 
7bd0: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  (u8)onError;.}..
7be0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
7bf0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
7c00: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
7c10: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
7c20: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
7c30: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
7c40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7c50: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
7c60: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
7c70: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
7c80: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
7c90: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
7ca0: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
7cb0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7cc0: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
7cd0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7ce0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
7cf0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
7d00: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
7d10: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
7d20: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
7d30: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
7d40: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
7d50: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
7d60: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
7d70: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
7d80: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
7d90: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
7da0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
7db0: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
7dc0: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
7e00: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
7e10: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
7e20: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7e30: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
7e40: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
7e50: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7e60: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
7e70: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7e80: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
7e90: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
7ea0: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
7eb0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7ec0: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
7ed0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7ee0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
7ef0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7f00: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
7f10: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
7f20: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
7f30: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
7f40: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
7f50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7f60: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
7f70: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
7f80: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
7f90: 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32  har *zIn){.  u32
7fa0: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
7fb0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7fc0: 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28 20  NUMERIC;..  if( 
7fd0: 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49 6e  zIn ) while( zIn
7fe0: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
7ff0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
8000: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
8010: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
8020: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
8030: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
8040: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
8050: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
8060: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
8070: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8080: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
8090: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
80a0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
80b0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
80c0: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
80d0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
80e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
80f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8100: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
8110: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
8120: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
8130: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
8140: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
8150: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
8160: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
8170: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
8180: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
8190: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
81a0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
81b0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
81c0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
81d0: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
81e0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
81f0: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
8200: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8210: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
8220: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8230: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
8240: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
8250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
8260: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
8270: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8280: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8290: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
82a0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
82b0: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
82c0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
82d0: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
82e0: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
82f0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8300: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8310: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8320: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
8330: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
8340: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
8350: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
8360: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8370: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
8380: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8390: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
83a0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
83b0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
83c0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
83d0: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
83e0: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
83f0: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
8400: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
8410: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8420: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
8430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8440: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
8450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8460: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8470: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8480: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8490: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
84a0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
84b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
84c0: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
84d0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
84e0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
84f0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
8500: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
8510: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
8520: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8530: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8540: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
8550: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
8560: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
8570: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
8580: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
8590: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
85a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
85b0: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
85c0: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
85d0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
85e0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
85f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8600: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
8610: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8620: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
8630: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
8640: 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72  Col;..  p = pPar
8650: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8660: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8670: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8680: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8690: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
86a0: 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  l-1];.  assert( 
86b0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
86c0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
86d0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
86e0: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
86f0: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
8700: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8710: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8720: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
8730: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
8740: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
8750: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8760: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8770: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
8780: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
8790: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
87a0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
87b0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
87c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
87d0: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
87e0: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
87f0: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
8800: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
8810: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8820: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8830: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8840: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8850: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8860: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8870: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
8880: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
8890: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
88a0: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
88b0: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
88c0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
88d0: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
88e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
88f0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
8900: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
8910: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
8920: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
8930: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
8940: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
8950: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
8960: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29  (pSpan->pExpr) )
8970: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8980: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8990: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
89a0: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
89b0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
89c0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
89d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
89e0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
89f0: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
8a00: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
8a10: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
8a20: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
8a30: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
8a40: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
8a50: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
8a60: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
8a70: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
8a80: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
8a90: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
8aa0: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
8ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8ac0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8ad0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8ae0: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
8af0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8b00: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58  pSpan->pExpr, EX
8b10: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
8b20: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8b30: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
8b40: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
8b50: 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >zDflt = sqlite3
8b60: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
8b70: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
8b80: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
8bb0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
8bc0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
8bd0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8be0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8bf0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
8c00: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
8c10: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
8c20: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
8c30: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
8c40: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
8c50: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
8c60: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
8c70: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
8c80: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
8c90: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
8ca0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
8cb0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
8cc0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
8cd0: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
8ce0: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
8cf0: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
8d00: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
8d10: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
8d20: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
8d30: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
8d40: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
8d50: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
8d60: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
8d70: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
8d80: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
8d90: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
8da0: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
8db0: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
8dc0: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
8dd0: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
8de0: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
8df0: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
8e00: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
8e10: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
8e20: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
8e30: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
8e40: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8e50: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
8e60: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
8e70: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
8e80: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
8e90: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
8ea0: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
8eb0: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
8ec0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
8ed0: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
8ee0: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
8ef0: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
8f00: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
8f10: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8f20: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
8f30: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
8f40: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
8f50: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
8f60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8f70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8f80: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
8f90: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
8fa0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
8fb0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
8fc0: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
8fd0: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
8fe0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
8ff0: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
9000: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
9010: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
9020: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
9030: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
9040: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
9050: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
9060: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
9070: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9080: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9090: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
90a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
90b0: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
90c0: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
90d0: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
90e0: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
90f0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
9100: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
9110: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
9120: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9130: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
9140: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
9150: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
9160: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
9170: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9180: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
9190: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
91a0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
91b0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
91c0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
91d0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
91e0: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
91f0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
9200: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
9210: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
9220: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
9230: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9240: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
9250: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9260: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
9270: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9280: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9290: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
92a0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
92b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
92c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
92d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
92e0: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
92f0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
9300: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9310: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
9320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9330: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
9340: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
9350: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
9360: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9370: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
9380: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
9390: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
93a0: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
93b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
93c0: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
93d0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
93e0: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
93f0: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
9400: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
9410: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
9420: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
9430: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
9440: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
9450: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
9460: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
9470: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
9480: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65  oincrement;.  }e
9490: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
94a0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
94b0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
94c0: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
94d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
94e0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
94f0: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
9500: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
9510: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9520: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
9530: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9540: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
9550: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
9560: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
9570: 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20  , 0, sortOrder, 
9580: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
9590: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
95a0: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
95b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
95c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
95d0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
95e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
95f0: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
9600: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
9610: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9620: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9630: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9640: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
9650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9660: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
9670: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9680: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
9690: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
96a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
96b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
96c0: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
96d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
96e0: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
96f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
9700: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
9710: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
9720: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61  _VTAB ){.    pTa
9730: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
9740: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
9750: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68  Tab->pCheck, pCh
9760: 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  eckExpr);.  }els
9770: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
9780: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9790: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70  te(db, pCheckExp
97a0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
97b0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
97c0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
97d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
97e0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
97f0: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
9800: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
9810: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9820: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
9830: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
9840: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
9850: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
9860: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9880: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
9890: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
98a0: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
98b0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
98c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
98d0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
98e0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
98f0: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
9900: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
9910: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
9920: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
9930: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
9940: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
9950: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
9960: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
9970: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
9980: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
9990: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
99a0: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
99b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
99c0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
99d0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
99e0: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
99f0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
9a00: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
9a10: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
9a20: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
9a30: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
9a40: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
9a50: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
9a60: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
9a70: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
9a80: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
9a90: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9aa0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9ab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
9ac0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
9ad0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9ae0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
9af0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
9b00: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
9b10: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
9b20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9b30: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9b40: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
9b50: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9b60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9b70: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9b80: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9b90: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9ba0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9bb0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
9bc0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9bd0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
9be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
9bf0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9c00: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9c10: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9c20: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9c30: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9c40: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9c50: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9c60: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
9c70: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
9c80: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
9c90: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
9ca0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
9cb0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
9cc0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
9cd0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
9ce0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
9cf0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9d00: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9d10: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9d20: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9d30: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9d40: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9d50: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9d60: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9d70: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9d80: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9d90: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
9da0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
9db0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
9dc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9dd0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
9de0: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
9df0: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
9e00: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
9e10: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
9e20: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
9e30: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
9e40: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
9e50: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
9e60: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
9e70: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
9e80: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
9e90: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
9ea0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
9eb0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
9ec0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
9ed0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9ee0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9ef0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9f00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9f10: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
9f20: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
9f30: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
9f40: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
9f50: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
9f60: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
9f70: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
9f80: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
9f90: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
9fa0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
9fb0: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
9fc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
9fd0: 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  etCollSeq(db, en
9fe0: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
9ff0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
a000: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a010: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a020: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
a030: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
a040: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
a050: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
a060: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
a070: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a080: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
a090: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
a0a0: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
a0b0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
a0c0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
a0d0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
a0e0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
a0f0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
a100: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
a110: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
a120: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
a130: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
a140: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
a150: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
a160: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
a170: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
a180: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
a190: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
a1a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
a1b0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
a1c0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
a1d0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
a1e0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
a1f0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
a200: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
a210: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
a220: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
a230: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
a240: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
a250: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
a260: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
a270: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
a280: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
a290: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a2a0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a2b0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a2c0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a2d0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a2e0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a2f0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a300: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a310: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a320: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a330: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a340: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a350: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a360: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a370: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a380: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a390: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a3a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a3b0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a3c0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
a3d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a3e0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a3f0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a400: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a410: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a420: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a430: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a440: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
a450: 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20  _VERSION, r1);. 
a460: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a470: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a480: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
a490: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
a4a0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
a4b0: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
a4c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
a4d0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
a4e0: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
a4f0: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
a500: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
a510: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
a520: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
a530: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
a540: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
a550: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
a560: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
a570: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
a580: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
a590: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
a5a0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
a5b0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
a5c0: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
a5d0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
a5e0: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
a5f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
a600: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
a610: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
a620: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
a630: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
a640: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
a650: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
a660: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
a670: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
a680: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
a690: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
a6a0: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
a6b0: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
a6c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
a6d0: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
a6e0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
a6f0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
a700: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
a710: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
a720: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
a730: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
a740: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
a750: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
a760: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
a770: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
a780: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
a790: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
a7a0: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
a7b0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
a7c0: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
a7d0: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
a7e0: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
a7f0: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
a800: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
a810: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
a820: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
a830: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
a840: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
a850: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
a860: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
a870: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
a880: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
a890: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
a8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
a8b0: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
a8c0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
a8d0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
a8e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a8f0: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
a900: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
a910: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
a920: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
a930: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
a940: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a950: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
a960: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
a970: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a980: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a990: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a9a0: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
a9b0: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
a9c0: 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79  ]) || sqlite3Key
a9d0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
a9e0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
a9f0: 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a  ( !needQuote ){.
aa00: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
aa10: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a  zIdent[j];.  }..
aa20: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
aa30: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
aa40: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
aa50: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
aa60: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
aa70: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
aa80: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
aa90: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
aaa0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
aab0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
aac0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
aad0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
aae0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
aaf0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
ab00: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
ab10: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
ab20: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
ab30: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
ab40: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
ab50: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
ab60: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
ab70: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
ab80: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
ab90: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
aba0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
abb0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
abc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
abd0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
abe0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
abf0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
ac00: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
ac10: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
ac20: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
ac30: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
ac40: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
ac50: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
ac60: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
ac70: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
ac80: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
ac90: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
aca0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
acb0: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
acc0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
acd0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
ace0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
acf0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
ad00: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
ad10: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
ad20: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
ad30: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
ad40: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
ad50: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20  qlite3Malloc( n 
ad60: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
ad70: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
ad80: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
ad90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ada0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
adb0: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43  ntf(n, zStmt, "C
adc0: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
add0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72    k = sqlite3Str
ade0: 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20  len30(zStmt);.  
adf0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
ae00: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
ae10: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
ae20: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
ae30: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
ae40: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
ae50: 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ++){.    static 
ae60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
ae70: 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a  st azType[] = {.
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
ae90: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f  E_AFF_TEXT    */
aea0: 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20   " TEXT",.      
aeb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
aec0: 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20  NONE    */ "",. 
aed0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
aee0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20  _AFF_NUMERIC */ 
aef0: 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20  " NUM",.        
af00: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  /* SQLITE_AFF_IN
af10: 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c  TEGER */ " INT",
af20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
af30: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a  TE_AFF_REAL    *
af40: 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b  / " REAL".    };
af50: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
af60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
af70: 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
af80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
af90: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
afa0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
afb0: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d  e3Strlen30(&zStm
afc0: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
afd0: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
afe0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
aff0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
b000: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b010: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
b020: 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29  _AFF_TEXT >= 0 )
b030: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
b040: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
b050: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 73  ITE_AFF_TEXT < s
b060: 69 7a 65 6f 66 28 61 7a 54 79 70 65 29 2f 73 69  izeof(azType)/si
b070: 7a 65 6f 66 28 61 7a 54 79 70 65 5b 30 5d 29 20  zeof(azType[0]) 
b080: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b090: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
b0a0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
b0b0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b0c0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
b0d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
b0e0: 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
b0f0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
b100: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
b110: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
b120: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b130: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b140: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
b150: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b160: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b170: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
b180: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
b190: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
b1a0: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
b1b0: 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e  F_TEXT];.    len
b1c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
b1d0: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
b1e0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
b1f0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b200: 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20  F_NONE .        
b210: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
b220: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
b230: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
b240: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
b250: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
b260: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
b270: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
b280: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
b290: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b2a0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
b2b0: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
b2c0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
b2d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b2e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
b2f0: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
b300: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
b310: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
b320: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b330: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
b340: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
b350: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
b360: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
b370: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
b380: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
b390: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
b3a0: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
b3b0: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
b3c0: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
b3d0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
b3e0: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
b3f0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
b400: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
b410: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
b420: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
b430: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
b440: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
b450: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
b460: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
b470: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
b480: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
b490: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
b4a0: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
b4b0: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
b4c0: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
b4d0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
b4e0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
b4f0: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
b500: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
b510: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
b520: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
b530: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
b540: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
b550: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
b560: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
b570: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
b580: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
b590: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
b5a0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
b5b0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
b5c0: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
b5d0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
b5e0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
b5f0: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
b600: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
b610: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
b620: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
b630: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
b640: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
b650: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
b660: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
b670: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
b680: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
b690: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
b6a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
b6b0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
b6c0: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
b6d0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
b6e0: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
b6f0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
b700: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e        /* The fin
b710: 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20  al ')' token in 
b720: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
b730: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
b740: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
b750: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
b760: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
b770: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
b780: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
b790: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b7a0: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
b7b0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
b7c0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
b7d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b7e0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
b7f0: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
b800: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
b810: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b820: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
b830: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
b840: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
b850: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
b860: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
b870: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
b880: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b890: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
b8a0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
b8b0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b8c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
b8d0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
b8e0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
b8f0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
b900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
b910: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
b920: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
b930: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
b940: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
b950: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
b960: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
b970: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
b980: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
b990: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
b9a0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
b9b0: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
b9c0: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
b9d0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
b9e0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
b9f0: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
ba00: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
ba10: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
ba20: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
ba30: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
ba40: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
ba50: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
ba60: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
ba70: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
ba80: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
ba90: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
baa0: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
bab0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
bac0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
bad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bae0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
baf0: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
bb00: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
bb10: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
bb20: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
bb30: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
bb40: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
bb50: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
bb60: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
bb70: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
bb80: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
bb90: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
bba0: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
bbb0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
bbc0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
bbd0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
bbe0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
bbf0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
bc00: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
bc10: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
bc20: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
bc30: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
bc40: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
bc50: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
bc60: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
bc70: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
bc80: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
bc90: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
bca0: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
bcb0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
bcc0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
bcd0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
bce0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
bcf0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
bd00: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
bd10: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
bd20: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
bd30: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
bd40: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
bd50: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
bd60: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
bd70: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
bd80: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
bd90: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
bda0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
bdb0: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
bdc0: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
bdd0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
bde0: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
bdf0: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
be00: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
be10: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
be20: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
be30: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
be40: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
be50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
be60: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e  arse);.    if( N
be70: 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
be80: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
be90: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
bea0: 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
beb0: 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
bec0: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
bed0: 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
bee0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
bef0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
bf00: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
bf10: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
bf20: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
bf30: 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
bf40: 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
bf50: 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
bf60: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
bf70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
bf80: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
bf90: 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
bfa0: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
bfb0: 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
bfc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
bfd0: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
bfe0: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
bff0: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
c000: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
c010: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
c020: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
c030: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
c040: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
c050: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
c060: 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
c070: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
c080: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
c090: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
c0a0: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
c0b0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
c0c0: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
c0d0: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
c0e0: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
c0f0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
c100: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
c110: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
c120: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
c130: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
c140: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
c150: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
c160: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
c170: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
c180: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
c190: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
c1a0: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
c1b0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
c1c0: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
c1d0: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
c1e0: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
c1f0: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
c200: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
c210: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
c220: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
c230: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
c240: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
c250: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
c260: 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c  dest;.      Tabl
c270: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20  e *pSelTab;..   
c280: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
c290: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
c2a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c2b0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
c2c0: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
c2d0: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
c2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2f0: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
c300: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
c310: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
c320: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
c330: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54  nit(&dest, SRT_T
c340: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
c350: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c360: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
c370: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
c380: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c390: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
c3a0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
c3b0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
c3c0: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
c3d0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
c3e0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
c3f0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
c400: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
c410: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
c420: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
c430: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
c440: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
c450: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
c460: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
c470: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
c480: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
c490: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
c4a0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
c4b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c4c0: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c  DeleteTable(pSel
c4d0: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
c4e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
c4f0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
c500: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
c510: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
c520: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
c530: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
c540: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
c550: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
c560: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28  lse{.      n = (
c570: 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70  int)(pEnd->z - p
c580: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
c590: 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  n.z) + 1;.      
c5a0: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
c5b0: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
c5c0: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
c5d0: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
c5e0: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
c5f0: 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
c600: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c610: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
c620: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
c630: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
c640: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
c650: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c660: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
c670: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
c680: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
c690: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
c6a0: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
c6b0: 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ected..    */.  
c6c0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
c6d0: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
c6e0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
c6f0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
c700: 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
c710: 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
c720: 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20  , rootpage=#%d, 
c730: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
c740: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64  "WHERE rowid=#%d
c750: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
c760: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
c770: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
c780: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
c790: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
c7a0: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
c7b0: 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
c7c0: 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
c7d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
c7e0: 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
c7f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c800: 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
c810: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
c820: 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
c830: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
c840: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
c850: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
c860: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
c870: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
c880: 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
c890: 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
c8a0: 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
c8b0: 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
c8c0: 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
c8d0: 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61     if( p->tabFla
c8e0: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
c8f0: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44  ement ){.      D
c900: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
c910: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  b[iDb];.      if
c920: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
c930: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
c940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
c950: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
c960: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
c970: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
c980: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
c990: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
c9a0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
c9b0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
c9c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
c9d0: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
c9e0: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
c9f0: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
ca00: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
ca10: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
ca20: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61  eAddOp4(v, OP_Pa
ca30: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
ca40: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  0, 0,.        sq
ca50: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ca60: 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22   "tbl_name='%q'"
ca70: 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44  ,p->zName), P4_D
ca80: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20  YNAMIC);.  }... 
ca90: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
caa0: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
cab0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
cac0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
cad0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
cae0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
caf0: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
cb00: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
cb10: 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61  ema = p->pSchema
cb20: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
cb30: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
cb40: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
cb50: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cb80: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d  Strlen30(p->zNam
cb90: 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e),p);.    if( p
cba0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
cbb0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
cbc0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
cbd0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
cbe0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
cbf0: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
cc00: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
cc10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
cc20: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
cc30: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
cc40: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
cc50: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
cc60: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
cc70: 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
cc80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
cc90: 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
cca0: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
ccb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ccc0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
ccd0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
cce0: 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
ccf0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
cd00: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
cd10: 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
cd20: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
cd30: 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
cd40: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
cd50: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
cd60: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
cd70: 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
cd80: 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
cd90: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
cda0: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
cdb0: 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
cdc0: 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
cdd0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
cde0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
cdf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ce00: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
ce10: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
ce20: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
ce30: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
ce40: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
ce50: 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
ce60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ce70: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
ce80: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
ce90: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
cea0: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
ceb0: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
cec0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
ced0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
cee0: 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
cef0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
cf00: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
cf10: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
cf20: 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
cf30: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
cf40: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
cf50: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
cf60: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
cf70: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
cf80: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
cf90: 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
cfa0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
cfb0: 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
cfc0: 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
cfd0: 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
cfe0: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
cff0: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
d000: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
d010: 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
d020: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
d030: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
d040: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
d050: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
d060: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
d070: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20  Token *pName;.  
d080: 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
d090: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d0a0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
d0b0: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
d0c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d0d0: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
d0e0: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
d0f0: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
d100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
d110: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d120: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d130: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
d140: 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
d150: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
d160: 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
d170: 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20  , noErr);.  p = 
d180: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
d190: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  e;.  if( p==0 ){
d1a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d1b0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d1c0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
d1d0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
d1e0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
d1f0: 20 29 3b 20 2f 2a 20 49 66 20 73 71 6c 69 74 65   ); /* If sqlite
d200: 33 53 74 61 72 74 54 61 62 6c 65 20 72 65 74 75  3StartTable retu
d210: 72 6e 20 6e 6f 6e 2d 4e 55 4c 4c 20 74 68 65 6e  rn non-NULL then
d220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
d240: 20 74 68 65 72 65 20 63 6f 75 6c 64 20 6e 6f 74   there could not
d250: 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20 65 72   have been an er
d260: 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ror */.  sqlite3
d270: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
d280: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
d290: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
d2a0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
d2b0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
d2c0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28  >pSchema);.  if(
d2d0: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
d2e0: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
d2f0: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
d300: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
d310: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
d320: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
d330: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d340: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d350: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d360: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
d370: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
d380: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
d390: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
d3a0: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
d3b0: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
d3c0: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
d3d0: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
d3e0: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
d3f0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
d400: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
d410: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
d420: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
d430: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
d440: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
d450: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
d460: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
d470: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
d480: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
d490: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d4a0: 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
d4b0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
d4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
d4d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d4e0: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
d4f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d500: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d510: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
d520: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
d530: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d540: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
d550: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d560: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
d570: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
d580: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
d590: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
d5a0: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
d5b0: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
d5c0: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
d5d0: 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a  f( ALWAYS(sEnd.z
d5e0: 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e  [0]!=0) && sEnd.
d5f0: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
d600: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
d610: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
d620: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
d630: 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
d640: 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  ->z);.  z = pBeg
d650: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
d660: 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73  ALWAYS(n>0) && s
d670: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
d680: 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
d690: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
d6a0: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
d6b0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
d6c0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
d6d0: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
d6e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
d6f0: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
d700: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
d710: 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
d720: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
d730: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d740: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
d750: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d760: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
d770: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d780: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d790: 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
d7a0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
d7b0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
d7c0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
d7d0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
d7e0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
d7f0: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
d800: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
d810: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
d820: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
d830: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
d840: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
d850: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
d860: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
d870: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d880: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
d890: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
d8a0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
d8b0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
d8c0: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
d8d0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
d8e0: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
d8f0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
d900: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
d910: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
d920: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
d930: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
d940: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
d950: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d960: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
d970: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
d980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
d990: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
d9a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
d9b0: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
d9c0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
d9d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
d9e0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d9f0: 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
da00: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
da10: 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c   (*xAuth)(void*,
da20: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  int,const char*,
da30: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
da40: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
da50: 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ar*);..  assert(
da60: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
da70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
da80: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
da90: 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
daa0: 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
dab0: 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
dac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
dad0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
dae0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
daf0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
db00: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
db10: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
db20: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
db30: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
db40: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
db50: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
db60: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
db70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
db80: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
db90: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
dba0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
dbb0: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
dbc0: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
dbd0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
dbe0: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
dbf0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
dc00: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
dc10: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
dc20: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
dc30: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
dc40: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
dc50: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
dc60: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
dc70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
dc80: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
dc90: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
dca0: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
dcb0: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
dcc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
dcd0: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
dce0: 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
dcf0: 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
dd00: 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
dd10: 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
dd20: 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
dd30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
dd40: 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
dd50: 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
dd60: 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
dd70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
dd80: 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
dd90: 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
dda0: 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
ddb0: 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
ddc0: 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
ddd0: 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
dde0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
ddf0: 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
de00: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
de10: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
de20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
de30: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
de40: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
de50: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
de60: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
de70: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
de80: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
de90: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
dea0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
deb0: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
dec0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
ded0: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
dee0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
def0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
df00: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
df10: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
df20: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
df30: 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
df40: 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
df50: 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
df60: 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
df70: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
df80: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
df90: 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
dfa0: 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
dfb0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
dfc0: 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
dfd0: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
dfe0: 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
dff0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
e000: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
e010: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
e020: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
e030: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
e040: 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
e050: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
e060: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
e070: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
e080: 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65  pSel ){.    u8 e
e090: 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d  nableLookaside =
e0a0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e0b0: 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d  Enabled;.    n =
e0c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
e0d0: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
e0e0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
e0f0: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
e100: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
e110: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64  nCol = -1;.    d
e120: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e130: 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64  abled = 0;.#ifnd
e140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e150: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
e160: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
e170: 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
e180: 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
e190: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
e1a0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
e1b0: 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
e1c0: 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
e1d0: 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
e1e0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
e1f0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
e200: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
e210: 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c  #endif.    db->l
e220: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e230: 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73  d = enableLookas
e240: 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ide;.    pParse-
e250: 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69  >nTab = n;.    i
e260: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
e270: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e280: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
e290: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
e2a0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
e2b0: 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  l;.      pTable-
e2c0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
e2d0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
e2e0: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
e2f0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
e300: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
e310: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
e320: 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  e(pSelTab);.    
e330: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
e340: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
e350: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
e360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
e370: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
e380: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
e390: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
e3a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e3b0: 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20  pSel);.  } else 
e3c0: 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
e3d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e3e0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
e3f0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
e400: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
e410: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e420: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
e430: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e440: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
e450: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e460: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
e470: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
e480: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
e490: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
e4a0: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
e4b0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
e4c0: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
e4d0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
e4e0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
e4f0: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
e500: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
e510: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
e520: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
e530: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
e540: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
e550: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
e560: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
e570: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
e580: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e590: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
e5a0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
e5b0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
e5c0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
e5d0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
e5e0: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
e5f0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
e600: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
e610: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
e620: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
e630: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
e640: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e650: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
e660: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e670: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
e680: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
e690: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
e6a0: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
e6b0: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
e6c0: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
e6d0: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
e6e0: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
e6f0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
e700: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
e710: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
e720: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
e730: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
e740: 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
e750: 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
e760: 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
e770: 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
e780: 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
e790: 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
e7a0: 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
e7b0: 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
e7c0: 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
e7d0: 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
e7e0: 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
e7f0: 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
e800: 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
e810: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
e820: 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
e830: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
e840: 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
e850: 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
e860: 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
e870: 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
e880: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
e890: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
e8a0: 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
e8b0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
e8c0: 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
e8d0: 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
e8e0: 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
e8f0: 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
e900: 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
e910: 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
e920: 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
e930: 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
e940: 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
e950: 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
e960: 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
e970: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
e980: 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
e990: 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
e9a0: 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
e9b0: 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
e9c0: 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
e9d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e9e0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
e9f0: 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
ea00: 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69  Moved(Db *pDb, i
ea10: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
ea20: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
ea30: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
ea40: 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d  Hash;..  pHash =
ea50: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
ea60: 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
ea70: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
ea80: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
ea90: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
eaa0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
eab0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
eac0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
ead0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
eae0: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
eaf0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
eb00: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
eb10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
eb20: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
eb30: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
eb40: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
eb50: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
eb60: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
eb70: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
eb80: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
eb90: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
eba0: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
ebb0: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
ebc0: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
ebd0: 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
ebe0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
ebf0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
ec00: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
ec10: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
ec20: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
ec30: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
ec40: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
ec50: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
ec60: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
ec70: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
ec80: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
ec90: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
eca0: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
ecb0: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
ecc0: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
ecd0: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
ece0: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
ecf0: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
ed00: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
ed10: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
ed20: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
ed30: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
ed40: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
ed50: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
ed60: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
ed70: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ed80: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
ed90: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
eda0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
edb0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
edc0: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
edd0: 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  1, iDb);.  sqlit
ede0: 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
edf0: 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
ee00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ee10: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
ee20: 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
ee30: 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
ee40: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
ee50: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
ee60: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
ee70: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
ee80: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
ee90: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
eea0: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
eeb0: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
eec0: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
eed0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
eee0: 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
eef0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
ef00: 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51  "#NNN" in the SQ
ef10: 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
ef20: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
ef30: 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
ef40: 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67  e.  ** is in reg
ef50: 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20  ister NNN.  See 
ef60: 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73  grammar rules as
ef70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ef80: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  e TK_REGISTER.  
ef90: 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64  ** token for add
efa0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
efb0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ion..  */.  sqli
efc0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
efd0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
efe0: 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
eff0: 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
f000: 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67   #%d AND rootpag
f010: 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61  e=#%d",.     pPa
f020: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
f030: 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
f040: 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62  TABLE(iDb), iTab
f050: 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e  le, r1, r1);.#en
f060: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  dif.  sqlite3Rel
f070: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f080: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
f090: 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64  * Write VDBE cod
f0a0: 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65  e to erase table
f0b0: 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73   pTab and all as
f0c0: 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73  sociated indices
f0d0: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64   on disk..** Cod
f0e0: 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
f0f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f100: 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61  bles and interna
f110: 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74  l schema definit
f120: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20  ions.** in case 
f130: 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f  a root-page belo
f140: 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72  nging to another
f150: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
f160: 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  by the btree lay
f170: 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64  er.** is also ad
f180: 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61  ded (this can ha
f190: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
f1a0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
f1b0: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e)..*/.static vo
f1c0: 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28  id destroyTable(
f1d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
f1e0: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66  able *pTab){.#if
f1f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f200: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64  AUTOVACUUM.  Ind
f210: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
f220: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
f230: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
f240: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
f250: 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79  hema);.  destroy
f260: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
f270: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62   pTab->tnum, iDb
f280: 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  );.  for(pIdx=pT
f290: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
f2a0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
f2b0: 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  xt){.    destroy
f2c0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
f2d0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
f2e0: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f  );.  }.#else.  /
f2f0: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
f300: 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61  e may be auto-va
f310: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66  cuum capable (if
f320: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f330: 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20  OVACUUM.  ** is 
f340: 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68  not defined), th
f350: 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  en it is importa
f360: 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65  nt to call OP_De
f370: 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a  stroy on the.  *
f380: 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  * table and inde
f390: 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20  x root-pages in 
f3a0: 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20  order, starting 
f3b0: 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63  with the numeric
f3c0: 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65  ally .  ** large
f3d0: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
f3e0: 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e  ber. This guaran
f3f0: 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f  tees that none o
f400: 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73  f the root-pages
f410: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74  .  ** to be dest
f420: 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74  royed is relocat
f430: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
f440: 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65   OP_Destroy. i.e
f450: 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f  . if the.  ** fo
f460: 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64  llowing were cod
f470: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50  ed:.  **.  ** OP
f480: 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a  _Destroy 4 0.  *
f490: 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65  * ....  ** OP_De
f4a0: 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20  stroy 5 0.  **. 
f4b0: 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67   ** and root pag
f4c0: 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20  e 5 happened to 
f4d0: 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  be the largest r
f4e0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
f4f0: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
f500: 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20  base, then root 
f510: 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20  page 5 would be 
f520: 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20  moved to page 4 
f530: 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50  by the .  ** "OP
f540: 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70  _Destroy 4 0" op
f550: 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71  code. The subseq
f560: 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79  uent "OP_Destroy
f570: 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a   5 0" would hit.
f580: 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74    ** a free-list
f590: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e   page..  */.  in
f5a0: 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74  t iTab = pTab->t
f5b0: 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74  num;.  int iDest
f5c0: 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68  royed = 0;..  wh
f5d0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e  ile( 1 ){.    In
f5e0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69  dex *pIdx;.    i
f5f0: 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b  nt iLargest = 0;
f600: 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72  ..    if( iDestr
f610: 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c  oyed==0 || iTab<
f620: 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20  iDestroyed ){.  
f630: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
f640: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Tab;.    }.    f
f650: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
f660: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
f670: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
f680: 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
f690: 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
f6a0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
f6b0: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
f6c0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
f6d0: 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
f6e0: 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
f6f0: 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
f700: 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
f710: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
f720: 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
f730: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
f740: 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gest==0 ){.     
f750: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c   return;.    }el
f760: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  se{.      int iD
f770: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
f780: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
f790: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
f7a0: 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72  ma);.      destr
f7b0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f7c0: 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62  e, iLargest, iDb
f7d0: 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f  );.      iDestro
f7e0: 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
f7f0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
f800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
f810: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f820: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
f830: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
f840: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
f850: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
f860: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
f870: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
f880: 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
f890: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
f8a0: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
f8b0: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
f8c0: 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
f8d0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
f8e0: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
f8f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
f900: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
f910: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
f920: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
f930: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f940: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f950: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
f960: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
f970: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
f980: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
f990: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
f9a0: 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20  e, isView, .    
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61          pName->a
f9d0: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
f9e0: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
f9f0: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
fa00: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
fa10: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
fa20: 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50  te3ErrorClear(pP
fa30: 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
fa40: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fa50: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
fa60: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
fa70: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
fa80: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
fa90: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
faa0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
fab0: 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
fac0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
fad0: 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
fae0: 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
faf0: 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
fb00: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
fb10: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
fb20: 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
fb30: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
fb40: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
fb50: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
fb60: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
fb70: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
fb80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
fb90: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
fba0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
fbb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
fbc0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
fbd0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fbe0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
fbf0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
fc00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
fc10: 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
fc20: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
fc30: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
fc40: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
fc50: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
fc60: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fc70: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fc80: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
fc90: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
fca0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
fcb0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
fcc0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
fcd0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
fce0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
fcf0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
fd00: 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
fd10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
fd20: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
fd30: 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
fd40: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
fd50: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fd60: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
fd70: 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
fd80: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
fd90: 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
fda0: 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
fdb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
fdc0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
fdd0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
fde0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fdf0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
fe00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fe10: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
fe20: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
fe30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fe40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
fe50: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
fe60: 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
fe70: 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
fe80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
fe90: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
fea0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
feb0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
fec0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
fed0: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
fee0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
fef0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
ff00: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
ff10: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
ff20: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
ff30: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
ff40: 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ite_", 7)==0 ){.
ff50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ff60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
ff70: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
ff80: 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
ff90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
ffa0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
ffb0: 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  e;.  }..#ifndef 
ffc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
ffd0: 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f  .  /* Ensure DRO
ffe0: 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75  P TABLE is not u
fff0: 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61  sed on a view, a
10000 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20  nd DROP VIEW is 
10010 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e  not used.  ** on
10020 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20   a table..  */. 
10030 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
10040 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
10050 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10060 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10070 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
10080 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
10090 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
100a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
100b0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
100c0 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
100d0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
100e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
100f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
10100 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
10110 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
10120 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
10130 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
10140 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  p_table;.  }.#en
10150 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
10160 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
10170 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
10180 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
10190 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
101a0 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
101b0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
101c0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
101d0 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
101e0 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62  ger;.    Db *pDb
101f0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
10200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
10210 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
10220 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
10230 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10240 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10250 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69  BLE.    if( IsVi
10260 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
10270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10280 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
10290 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
102a0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
102b0 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
102c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
102d0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
102e0 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a  pped. Code.    *
102f0 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
10300 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
10310 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
10320 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a  ter and/or.    *
10330 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
10340 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
10350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72  ..    */.    pTr
10360 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
10370 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
10380 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 77 68  e, pTab);.    wh
10390 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
103a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
103b0 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
103c0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
103d0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54  || .          pT
103e0 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
103f0 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
10400 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ema );.      sql
10410 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
10420 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
10430 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72 69  ger);.      pTri
10440 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
10450 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23  >pNext;.    }..#
10460 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10470 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
10480 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
10490 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
104a0 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
104b0 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
104c0 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74  ed with.    ** t
104d0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
104e0 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20  ropped. This is 
104f0 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
10500 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
10510 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 62  .    ** at the b
10520 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
10530 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
10540 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
10550 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f  eds to.    ** mo
10560 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
10570 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
10580 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
10590 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20  acuum mode)..   
105a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
105b0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
105c0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
105d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
105e0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
105f0 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
10600 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65  E FROM %s.sqlite
10610 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
10620 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
10630 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
10640 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ab->zName.      
10650 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10660 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
10670 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
10680 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
10690 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
106a0 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  r to the.    ** 
106b0 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
106c0 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
106d0 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
106e0 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
106f0 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  es.    ** every 
10700 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
10710 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
10720 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
10730 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20  he one being.   
10740 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
10750 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
10760 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63  d seperately bec
10770 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
10780 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  an be.    ** cre
10790 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
107a0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
107b0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
107c0 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20   in another.    
107d0 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
107e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
107f0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10800 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c  e, .        "DEL
10810 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
10820 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
10830 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
10840 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70  ger'",.        p
10850 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
10860 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
10870 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
10880 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20 73 74 61   /* Drop any sta
10890 74 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65  tistics from the
108a0 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
108b0 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73 74  ble, if it exist
108c0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  s */.    if( sql
108d0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
108e0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
108f0 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
10900 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
10910 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10920 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10930 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
10940 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57  Q.sqlite_stat1 W
10950 48 45 52 45 20 74 62 6c 3d 25 51 22 2c 20 70 44  HERE tbl=%Q", pD
10960 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
10970 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
10980 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 69     }..    if( !i
10990 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
109a0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
109b0 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
109c0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
109d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
109e0 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
109f0 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
10a00 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
10a10 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20  a and modify.   
10a20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
10a30 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ookie..    */.  
10a40 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
10a50 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
10a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10a70 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
10a80 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
10a90 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
10aa0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
10ab0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
10ac0 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
10ad0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
10ae0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10af0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
10b00 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
10b10 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
10b20 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a  tAll(db, iDb);..
10b30 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
10b40 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
10b50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
10b60 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
10b70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10b80 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
10b90 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
10ba0 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
10bb0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
10bc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
10bd0 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
10be0 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
10bf0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
10c00 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
10c10 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
10c20 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
10c30 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
10c40 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
10c50 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
10c60 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
10c70 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
10c80 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
10c90 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
10ca0 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
10cb0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
10cc0 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
10cd0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
10ce0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
10cf0 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
10d00 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
10d10 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
10d20 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
10d30 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
10d40 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
10d50 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
10d60 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
10d70 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
10d80 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
10d90 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
10da0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
10db0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
10dc0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10dd0 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
10de0 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
10df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
10e00 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
10e10 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
10e20 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
10e30 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
10e40 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
10e50 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
10e60 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
10e70 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
10e80 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
10e90 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
10ea0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10eb0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10ec0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
10ed0 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
10ee0 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
10ef0 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
10f00 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
10f10 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
10f20 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
10f30 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
10f40 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
10f50 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
10f60 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
10f70 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
10f80 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
10f90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
10fa0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
10fb0 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
10fc0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
10fd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
10fe0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10ff0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
11000 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
11010 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
11020 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
11030 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
11040 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
11050 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
11060 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
11070 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
11080 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
11090 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
110a0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
110b0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
110c0 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
110d0 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
110e0 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
110f0 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
11100 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
11110 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
11120 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11130 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
11140 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
11150 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
11160 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
11170 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
11180 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
11190 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
111a0 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
111b0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
111c0 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
111d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
111e0 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
111f0 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
11200 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
11210 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11220 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
11230 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11240 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
11250 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
11260 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
11270 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
11280 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
11290 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
112a0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
112b0 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
112c0 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
112d0 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
112e0 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
112f0 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
11300 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
11310 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
11320 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
11330 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
11340 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
11350 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
11360 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11370 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
11380 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
11390 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
113a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
113b0 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
113c0 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
113d0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
113e0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
113f0 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
11400 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
11410 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
11420 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
11430 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
11440 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
11450 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
11460 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
11470 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
11480 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
11490 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
114a0 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
114b0 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
114c0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
114d0 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
114e0 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
114f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
11500 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
11510 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
11520 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
11530 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
11540 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
11550 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
11560 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
11570 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
11580 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
11590 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
115a0 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
115b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
115c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
115d0 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
115e0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
115f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11600 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
11610 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
11620 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
11630 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
11640 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
11650 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
11660 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
11670 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11690 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
116a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
116b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
116c0 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
116d0 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
116e0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
116f0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
11700 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
11710 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
11720 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
11730 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
11740 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
11750 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
11760 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
11770 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
11780 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 28 75  >deleteConf = (u
11790 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29  8)(flags & 0xff)
117a0 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
117b0 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 28 66 6c  eConf = (u8)((fl
117c0 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
117d0 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  f);.  pFKey->ins
117e0 65 72 74 43 6f 6e 66 20 3d 20 28 75 38 29 28 28  ertConf = (u8)((
117f0 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20  flags >> 16 ) & 
11800 30 78 66 66 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  0xff);..  /* Lin
11810 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
11820 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
11830 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
11840 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
11850 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
11860 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
11870 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11880 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
11890 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
118a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
118b0 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
118c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
118d0 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
118e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
118f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
11900 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
11910 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11920 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
11930 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
11940 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
11950 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
11960 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
11970 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
11980 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
11990 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
119a0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
119b0 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
119c0 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
119d0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
119e0 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
119f0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
11a00 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
11a10 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
11a20 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
11a30 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
11a40 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
11a50 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
11a60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11a70 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
11a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11a90 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
11aa0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
11ab0 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
11ac0 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
11ad0 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
11ae0 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
11af0 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
11b00 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
11b10 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
11b20 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 0a  sDeferred==1 );.
11b30 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
11b40 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
11b50 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
11b60 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11b70 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
11b80 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
11b90 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
11ba0 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
11bb0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
11bc0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
11bd0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
11be0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
11bf0 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
11c00 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
11c10 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
11c20 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
11c30 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
11c40 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
11c50 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
11c60 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
11c70 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
11c80 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
11c90 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
11ca0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
11cb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
11cc0 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
11cd0 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
11ce0 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
11cf0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
11d00 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
11d10 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
11d20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
11d30 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
11d40 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11d50 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
11d60 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
11d70 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
11d80 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
11d90 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
11da0 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
11db0 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
11dc0 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
11dd0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
11de0 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
11df0 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
11e00 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
11e10 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
11e20 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
11e30 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
11e40 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
11e50 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
11e60 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
11e70 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
11e80 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
11e90 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11eb0 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
11ec0 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
11ed0 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11ef0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
11f00 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
11f30 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
11f40 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11f50 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
11f60 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
11f70 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
11f80 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
11f90 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20 20  nt regIdxKey;   
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11fb0 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61   Registers conta
11fc0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
11fd0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  key */.  int reg
11fe0 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
11ff0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12000 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
12010 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
12020 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
12030 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12040 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
12050 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12060 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
12070 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12080 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
12090 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
120a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
120b0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
120c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
120d0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
120e0 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
120f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
12100 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
12110 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
12120 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
12130 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
12140 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
12150 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
12160 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
12170 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
12180 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
12190 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
121a0 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
121b0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
121c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
121d0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
121e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
121f0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
12200 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
12210 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
12220 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
12230 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
12240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12250 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
12260 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
12270 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
12280 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
12290 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
122a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
122b0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
122c0 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
122d0 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
122e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
122f0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
12300 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
12310 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
12320 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12330 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12340 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
12350 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
12360 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
12370 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
12380 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
12390 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
123a0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
123b0 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  , 0);.  regRecor
123c0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
123d0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
123e0 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71 6c   regIdxKey = sql
123f0 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
12400 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e  xKey(pParse, pIn
12410 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65  dex, iTab, regRe
12420 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28 20  cord, 1);.  if( 
12430 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
12440 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
12450 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f 77  const int regRow
12460 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b  id = regIdxKey +
12470 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
12480 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
12490 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
124a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
124b0 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20 63   2;.    void * c
124c0 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20 53  onst pRegKey = S
124d0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
124e0 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20 20  (regIdxKey);..  
124f0 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74 65    /* The registe
12500 72 73 20 61 63 63 65 73 73 65 64 20 62 79 20 74  rs accessed by t
12510 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f  he OP_IsUnique o
12520 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f 63  pcode were alloc
12530 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69 6e  ated.    ** usin
12540 67 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  g sqlite3GetTemp
12550 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20 6f  Range() inside o
12560 66 20 74 68 65 20 73 71 6c 69 74 65 33 47 65 6e  f the sqlite3Gen
12570 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29 0a  erateIndexKey().
12580 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
12590 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74  e. Just before t
125a0 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  hat function was
125b0 20 66 72 65 65 64 20 74 68 65 79 20 77 65 72 65   freed they were
125c0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
125d0 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65   (made available
125e0 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   to the compiler
125f0 20 66 6f 72 20 72 65 75 73 65 29 20 75 73 69 6e   for reuse) usin
12600 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  g .    ** sqlite
12610 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
12620 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65 20  e(). So in some 
12630 77 61 79 73 20 68 61 76 69 6e 67 20 74 68 65 20  ways having the 
12640 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20 20  OP_IsUnique.    
12650 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74 68  ** opcode use th
12660 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
12670 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61 6e  within seems dan
12680 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72 2c  gerous. However,
12690 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77 65   since.    ** we
126a0 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61   can be sure tha
126b0 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70 20  t no other temp 
126c0 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62  registers have b
126d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  een allocated.  
126e0 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69 74    ** since sqlit
126f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
12700 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2c  ge() was called,
12710 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 64   it is safe to d
12720 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o so..    */.   
12730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12740 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75  p4(v, OP_IsUniqu
12750 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65 67  e, iIdx, j2, reg
12760 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c 20  Rowid, pRegKey, 
12770 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73  P4_INT32);.    s
12780 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
12790 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70 50  aint(.        pP
127a0 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
127b0 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
127c0 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
127d0 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
127e0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
127f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
12800 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
12810 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
12820 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12830 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
12840 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
12850 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12860 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
12870 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
12880 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
12890 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
128a0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
128b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
128c0 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
128d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
128e0 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
128f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12900 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
12910 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Idx);.}../*.** C
12920 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
12930 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
12940 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
12950 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
12960 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
12970 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
12980 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
12990 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
129a0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
129b0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
129c0 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
129d0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
129e0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
129f0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
12a00 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
12a10 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
12a20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
12a30 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
12a40 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
12a50 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
12a60 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
12a70 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
12a80 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
12a90 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
12aa0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
12ab0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
12ac0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
12ad0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
12ae0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
12af0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
12b00 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
12b10 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
12b20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
12b30 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
12b40 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
12b50 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
12b60 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
12b70 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
12b80 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
12b90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12ba0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
12bb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12bc0 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
12bd0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
12be0 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
12bf0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
12c00 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
12c10 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
12c20 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
12c30 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
12c40 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
12c50 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
12c60 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
12c70 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
12c80 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
12c90 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
12ca0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
12cb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
12cc0 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
12cd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
12ce0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
12cf0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
12d00 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
12d10 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
12d20 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
12d30 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
12d40 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
12d50 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
12d60 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
12d70 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
12d80 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
12d90 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
12da0 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
12db0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
12dc0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
12dd0 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72  rder,     /* Sor
12de0 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61  t order of prima
12df0 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73  ry key when pLis
12e00 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  t==NULL */.  int
12e10 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20   ifNotExist     
12e20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66  /* Omit error if
12e30 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
12e40 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
12e50 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
12e60 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
12e70 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
12e80 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
12e90 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
12ea0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
12eb0 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
12ec0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
12ed0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
12ee0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
12ef0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12f00 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
12f10 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
12f20 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
12f30 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f  nullId;        /
12f40 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72  * Fake token for
12f50 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73   an empty ID lis
12f60 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  t */.  DbFixer s
12f70 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
12f80 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
12f90 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
12fa0 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
12fb0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
12fc0 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
12fd0 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
12fe0 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
12ff0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13000 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
13010 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
13020 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
13030 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
13040 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
13050 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
13060 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
13070 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
13080 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
13090 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
130a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
130b0 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
130c0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
130d0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
130e0 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
130f0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
13100 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
13110 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
13120 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  List */.  int nC
13130 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ol;.  int nExtra
13140 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
13150 78 74 72 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  xtra;..  assert(
13160 20 70 53 74 61 72 74 3d 3d 30 20 7c 7c 20 70 45   pStart==0 || pE
13170 6e 64 21 3d 30 20 29 3b 20 2f 2a 20 70 45 6e 64  nd!=0 ); /* pEnd
13180 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
13190 4c 20 69 66 20 70 53 74 61 72 74 20 69 73 20 2a  L if pStart is *
131a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
131b0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
131c0 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
131d0 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
131e0 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
131f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13200 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
13210 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
13220 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13230 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
13240 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
13250 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
13260 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
13270 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13280 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
13290 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
132a0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
132b0 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
132c0 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
132d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
132e0 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
132f0 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
13300 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
13310 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
13320 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
13330 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
13340 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
13350 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
13360 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
13370 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
13380 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
13390 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
133a0 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
133b0 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
133c0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
133d0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
133e0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
133f0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
13400 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13410 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e  ate_index;..#ifn
13420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13430 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
13440 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
13450 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
13460 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
13470 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
13480 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
13490 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
134a0 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
134b0 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
134c0 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
134d0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
134e0 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
134f0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
13500 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
13510 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
13520 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
13530 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
13540 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
13550 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
13560 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
13570 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
13580 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
13590 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
135a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
135b0 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
135c0 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
135d0 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
135e0 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
135f0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
13600 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
13610 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
13620 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
13630 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
13640 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
13650 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
13660 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
13670 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
13680 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
13690 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
136a0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
136b0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
136c0 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
136d0 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  0, pTblName->a[0
136e0 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
136f0 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d    pTblName->a[0]
13700 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
13710 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 64 62   if( !pTab || db
13720 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13730 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13740 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
13750 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
13760 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ].pSchema==pTab-
13770 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65  >pSchema );.  }e
13780 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
13790 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
137a0 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
137b0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
137c0 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
137d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
137e0 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
137f0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13800 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
13810 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
13820 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
13830 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
13840 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13850 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
13860 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
13870 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13880 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
13890 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  , 7)==0 .       
138a0 26 26 20 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d  && memcmp(&pTab-
138b0 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72  >zName[7],"alter
138c0 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20  tab_",9)!=0 ){. 
138d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
138e0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
138f0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
13900 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
13910 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13920 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13930 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
13940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13950 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
13960 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13970 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13980 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
13990 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
139a0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
139b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
139c0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
139d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
139e0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
139f0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13a00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13a10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
13a20 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
13a30 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
13a40 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
13a50 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13a60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13a70 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
13a80 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
13a90 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
13aa0 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
13ab0 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
13ac0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
13ad0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
13ae0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
13af0 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
13b00 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
13b10 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
13b20 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
13b30 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
13b40 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
13b50 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
13b60 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
13b70 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
13b80 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
13b90 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
13ba0 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
13bb0 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
13bc0 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
13bd0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
13be0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
13bf0 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
13c00 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
13c10 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
13c20 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
13c30 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
13c40 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
13c50 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
13c60 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
13c70 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
13c80 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
13c90 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
13ca0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
13cb0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13cc0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
13cd0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
13ce0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13cf0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
13d00 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13d10 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
13d20 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
13d30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13d40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13d60 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
13d70 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
13d80 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
13d90 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
13da0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13db0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13dc0 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
13dd0 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
13de0 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
13df0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13e00 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13e20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
13e30 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
13e40 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
13e50 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
13e60 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
13e70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13e80 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
13e90 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
13ea0 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
13eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
13ec0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13ed0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
13ee0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
13ef0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
13f00 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
13f10 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
13f20 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
13f30 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
13f40 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
13f50 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
13f60 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
13f70 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
13f80 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
13f90 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
13fa0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13fb0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13fc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
13fd0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
13fe0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
13ff0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
14000 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14010 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
14020 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
14030 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
14040 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
14050 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14060 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14070 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
14080 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
14090 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
140a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
140b0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
140c0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
140d0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
140e0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
140f0 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
14100 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
14110 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
14120 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14130 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
14140 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
14150 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14160 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14170 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
14180 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
14190 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
141a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
141b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
141c0 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
141d0 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
141e0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
141f0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
14200 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
14210 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
14220 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
14230 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
14240 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
14250 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
14260 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
14270 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
14280 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
14290 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
142a0 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  n30((char*)nullI
142b0 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
142c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
142d0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
142e0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
142f0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
14300 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14310 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
14320 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
14330 72 73 65 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c  rse, pList, &nul
14340 6c 49 64 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  lId, 0);.    pLi
14350 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
14360 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64  er = (u8)sortOrd
14370 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  er;.  }..  /* Fi
14380 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
14390 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
143a0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
143b0 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
143c0 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
143d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
143e0 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
143f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
14400 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
14410 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
14420 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
14430 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
14440 78 70 72 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  xpr ){.      Col
14450 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45  lSeq *pColl = pE
14460 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
14470 20 20 2f 2a 20 45 69 74 68 65 72 20 70 43 6f 6c    /* Either pCol
14480 6c 21 3d 30 20 6f 72 20 74 68 65 72 65 20 77 61  l!=0 or there wa
14490 73 20 61 6e 20 4f 4f 4d 20 66 61 69 6c 75 72 65  s an OOM failure
144a0 2e 20 20 42 75 74 20 69 66 20 61 6e 20 4f 4f 4d  .  But if an OOM
144b0 0a 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 75 72  .      ** failur
144c0 65 20 77 65 20 68 61 76 65 20 71 75 69 74 20 62  e we have quit b
144d0 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74  efore reaching t
144e0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
144f0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
14500 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
14510 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
14520 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14530 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
14540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14550 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
14560 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
14570 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
14580 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
14590 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
145a0 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
145b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
145c0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  dex = sqlite3DbM
145d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
145e0 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65       sizeof(Inde
145f0 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  x) +            
14600 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
14610 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73  ture  */.      s
14620 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20  izeof(int)*nCol 
14630 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  +           /* I
14640 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
14650 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14660 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  int)*(nCol+1) + 
14670 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14680 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20  iRowEst   */.   
14690 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a     sizeof(char *
146a0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
146b0 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
146c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a      */.      siz
146d0 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20  eof(u8)*nCol +  
146e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
146f0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
14700 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31  .      nName + 1
14710 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
14720 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61      /* Index.zNa
14730 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  me      */.     
14740 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14760 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
14770 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29  nce names */.  )
14780 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14790 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
147a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
147b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
147c0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
147d0 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b  char**)(&pIndex[
147e0 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  1]);.  pIndex->a
147f0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
14800 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
14810 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
14820 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
14830 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e  unsigned *)(&pIn
14840 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
14850 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
14860 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
14870 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52   *)(&pIndex->aiR
14880 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a  owEst[nCol+1]);.
14890 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
148a0 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
148b0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ex->aSortOrder[n
148c0 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20  Col]);.  zExtra 
148d0 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
148e0 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b  ex->zName[nName+
148f0 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  1]);.  memcpy(pI
14900 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
14910 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
14920 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
14930 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
14940 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
14950 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
14960 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
14970 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
14980 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
14990 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a  (u8)(pName==0);.
149a0 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
149b0 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
149c0 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20  .pSchema;..  /* 
149d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
149e0 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
149f0 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
14a00 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
14a10 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
14a20 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
14a30 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
14a40 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
14a50 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
14a60 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
14a70 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
14a80 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
14a90 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
14aa0 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
14ab0 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
14ac0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
14ad0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
14ae0 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
14af0 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
14b00 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
14b10 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
14b20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
14b30 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
14b40 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  ot found..  **. 
14b50 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61   ** TODO:  Add a
14b60 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   test to make su
14b70 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  re that the same
14b80 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e   column is not n
14b90 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  amed.  ** more t
14ba0 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
14bb0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
14bc0 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
14bd0 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a  instance of.  **
14be0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
14bf0 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
14c00 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
14c10 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
14c20 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63   the.  ** same c
14c30 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
14c40 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
14c50 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
14c60 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  that would .  **
14c70 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
14c80 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
14c90 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
14ca0 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  a warning..  */.
14cb0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
14cc0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
14cd0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
14ce0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
14cf0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
14d00 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
14d10 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
14d20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43     Column *pTabC
14d30 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75  ol;.    int requ
14d40 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
14d50 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
14d80 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
14d90 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ..    for(j=0, p
14da0 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
14db0 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
14dc0 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
14dd0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
14de0 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
14df0 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
14e00 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
14e10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
14e20 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
14e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14e40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
14e50 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
14e60 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
14e70 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
14e80 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
14e90 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14ea0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14eb0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
14ec0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
14ed0 3b 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69  ;.    /* Justifi
14ee0 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 41 4c  cation of the AL
14ef0 57 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e  WAYS(pListItem->
14f00 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 3a 20 20  pExpr->pColl):  
14f10 42 65 63 61 75 73 65 20 6f 66 0a 20 20 20 20 2a  Because of.    *
14f20 2a 20 74 68 65 20 77 61 79 20 74 68 65 20 22 69  * the way the "i
14f30 64 78 6c 69 73 74 22 20 6e 6f 6e 2d 74 65 72 6d  dxlist" non-term
14f40 69 6e 61 6c 20 69 73 20 63 6f 6e 73 74 72 75 63  inal is construc
14f50 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
14f60 72 2c 0a 20 20 20 20 2a 2a 20 69 66 20 70 4c 69  r,.    ** if pLi
14f70 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 69 73  stItem->pExpr is
14f80 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 65   not null then e
14f90 69 74 68 65 72 20 70 4c 69 73 74 49 74 65 6d 2d  ither pListItem-
14fa0 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 0a 20 20  >pExpr->pColl.  
14fb0 20 20 2a 2a 20 6d 75 73 74 20 65 78 69 73 74 20    ** must exist 
14fc0 6f 72 20 65 6c 73 65 20 74 68 65 72 65 20 6d 75  or else there mu
14fd0 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20  st have been an 
14fe0 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
14ff0 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  if there.    ** 
15000 77 61 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  was an OOM error
15010 2c 20 77 65 20 77 6f 75 6c 64 20 6e 65 76 65 72  , we would never
15020 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
15030 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  t. */.    if( pL
15040 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26  istItem->pExpr &
15050 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74  & ALWAYS(pListIt
15060 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
15070 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ) ){.      int n
15080 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
15090 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
150a0 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61  Expr->pColl->zNa
150b0 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  me;.      nColl 
150c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
150d0 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
150e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
150f0 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
15100 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
15110 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
15120 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
15130 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
15140 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
15150 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
15160 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oll;.    }else{.
15170 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
15180 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
15190 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43  l;.      if( !zC
151a0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  oll ){.        z
151b0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
151c0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
151d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
151e0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
151f0 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
15200 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
15210 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
15220 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15230 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
15240 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
15250 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
15260 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
15270 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
15280 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
15290 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
152a0 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
152b0 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
152c0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
152d0 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
152e0 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
152f0 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
15300 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
15310 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
15320 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
15330 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
15340 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
15350 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
15360 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
15370 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
15380 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
15390 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
153a0 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
153b0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
153c0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
153d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
153e0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
153f0 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
15400 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
15410 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
15420 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
15430 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
15440 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
15450 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
15460 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
15470 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
15480 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
15490 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
154a0 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
154b0 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
154c0 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
154d0 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
154e0 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
154f0 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
15500 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
15510 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
15520 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
15530 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
15540 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
15550 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15560 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
15570 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
15580 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
15590 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
155a0 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
155b0 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
155c0 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
155d0 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
155e0 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
155f0 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
15600 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
15610 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
15620 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
15630 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
15640 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
15650 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
15660 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
15670 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
15680 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
15690 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
156a0 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
156b0 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
156c0 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
156d0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
156e0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
156f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
15700 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
15710 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
15720 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
15730 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
15740 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
15750 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
15760 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
15770 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
15780 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
15790 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
157a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
157b0 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
157c0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
157d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
157e0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
157f0 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
15800 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15810 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
15820 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
15830 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
15840 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
15850 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
15860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15870 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
15880 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
15890 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
158a0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
158b0 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
158c0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
158d0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
158e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
158f0 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
15900 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
15910 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
15920 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
15930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
15940 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
15950 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
15960 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
15970 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
15980 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
15990 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
159a0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
159b0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
159c0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
159d0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
159e0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
159f0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
15a00 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
15a10 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
15a20 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
15a30 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
15a40 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
15a50 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
15a60 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
15a70 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
15a80 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
15a90 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
15aa0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
15ab0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
15ac0 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
15ad0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
15ae0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
15af0 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
15b00 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
15b10 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
15b20 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
15b30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15b40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15b50 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
15b60 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
15b70 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
15b80 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
15b90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
15ba0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
15bb0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
15bc0 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
15bd0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
15be0 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
15bf0 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
15c00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15c10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
15c20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15c40 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
15c50 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
15c60 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
15c70 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
15c80 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
15c90 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
15ca0 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
15cb0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
15cc0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
15cd0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
15ce0 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
15cf0 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
15d00 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
15d30 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15d40 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a  pIndex->zName),.
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
15d70 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
15d80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
15d90 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
15da0 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
15db0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
15dc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15dd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
15de0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15df0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
15e00 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
15e10 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
15e20 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
15e30 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  e!=0 ){.      pI
15e40 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
15e50 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
15e60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15e70 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
15e80 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72  usy is 0 then cr
15e90 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
15ea0 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
15eb0 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
15ec0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
15ed0 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
15ee0 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
15ef0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
15f00 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
15f10 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
15f20 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
15f30 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
15f40 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65  s 0 when the use
15f50 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61  r first enters a
15f60 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20   CREATE INDEX . 
15f70 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62   ** command.  db
15f80 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
15f90 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
15fa0 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
15fb0 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
15fc0 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
15fd0 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
15fe0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
15ff0 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
16000 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
16010 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
16020 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
16030 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
16040 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
16050 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
16060 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
16070 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
16080 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
16090 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
160a0 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
160b0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
160c0 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
160d0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
160e0 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
160f0 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
16100 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
16110 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
16120 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
16130 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
16140 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
16150 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ed..  */.  else{
16160 20 2f 2a 20 69 66 28 20 64 62 2d 3e 69 6e 69 74   /* if( db->init
16170 2e 62 75 73 79 3d 3d 30 20 29 20 2a 2f 0a 20 20  .busy==0 ) */.  
16180 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
16190 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
161a0 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
161b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20  rse->nMem;..    
161c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
161d0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
161e0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
161f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16200 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  x;...    /* Crea
16210 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
16220 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
16230 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
16240 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
16250 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
16260 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
16270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16280 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
16290 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f  b, iMem);..    /
162a0 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
162b0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
162c0 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
162d0 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
162e0 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
162f0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
16300 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
16310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16320 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  End!=0 );.      
16330 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78  /* A named index
16340 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
16350 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  t CREATE INDEX s
16360 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
16370 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
16380 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
16390 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
163a0 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72  s",.        onEr
163b0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
163c0 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20  " : " UNIQUE",. 
163d0 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d         pEnd->z -
163e0 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20   pName->z + 1,. 
163f0 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29         pName->z)
16400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16410 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
16420 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
16430 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
16440 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
16450 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
16460 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  /* zStmt = sqlit
16470 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a  e3MPrintf(""); *
16480 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
16490 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
164a0 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
164b0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
164c0 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
164d0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
164e0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
164f0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  se, .        "IN
16500 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
16510 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
16520 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a  Q,%Q,#%d,%Q);",.
16530 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
16540 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
16550 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
16560 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
16570 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
16580 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
16590 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
165a0 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
165b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
165c0 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
165d0 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
165e0 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
165f0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
16600 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
16610 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
16620 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
16630 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
16640 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
16650 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
16660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16670 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
16680 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
16690 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
166a0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
166b0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
166c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
166d0 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(v, OP_ParseS
166e0 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
166f0 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
16700 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
16710 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65  ame='%q'", pInde
16720 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59  x->zName), P4_DY
16730 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
16740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16750 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29  v, OP_Expire, 0)
16760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16770 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
16780 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
16790 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
167a0 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
167b0 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
167c0 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
167d0 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
167e0 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
167f0 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
16800 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
16810 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
16820 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
16830 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
16840 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
16850 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
16860 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
16870 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
16880 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
16890 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
168a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
168b0 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
168c0 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
168d0 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
168e0 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
168f0 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
16900 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
16910 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
16920 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
16930 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
16940 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
16950 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
16960 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
16970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
16980 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
16990 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
169a0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
169b0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
169c0 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
169d0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
169e0 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
169f0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
16a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
16a10 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
16a20 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
16a30 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
16a40 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
16a50 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
16a60 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
16a70 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
16a80 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
16a90 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
16aa0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
16ab0 74 65 33 5f 66 72 65 65 28 70 49 6e 64 65 78 2d  te3_free(pIndex-
16ac0 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73  >zColAff);.    s
16ad0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16ae0 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20   pIndex);.  }.  
16af0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
16b00 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
16b10 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
16b20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62  stDelete(db, pTb
16b30 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
16b40 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
16b50 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
16b60 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
16b70 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
16b80 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
16b90 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
16ba0 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
16bb0 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
16bc0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
16bd0 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
16be0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
16bf0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
16c00 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
16c10 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
16c20 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
16c30 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
16c40 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
16c50 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
16c60 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
16c70 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
16c80 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
16c90 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
16ca0 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
16cb0 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
16cc0 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
16cd0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
16ce0 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
16cf0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
16d00 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
16d10 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
16d20 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
16d30 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
16d40 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
16d50 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
16d60 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
16d70 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
16d80 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
16d90 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
16da0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
16db0 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
16dc0 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
16dd0 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
16de0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
16df0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
16e00 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
16e10 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
16e20 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
16e30 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
16e40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
16e50 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
16e60 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
16e70 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
16e80 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
16e90 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
16ea0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16eb0 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
16ec0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
16ed0 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64  nsigned *a = pId
16ee0 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69  x->aiRowEst;.  i
16ef0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
16f00 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d  a!=0 );.  a[0] =
16f10 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28   1000000;.  for(
16f20 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i=pIdx->nColumn;
16f30 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=5; i--){.   
16f40 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20   a[i] = 5;.  }. 
16f50 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a   while( i>=1 ){.
16f60 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20      a[i] = 11 - 
16f70 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a  i;.    i--;.  }.
16f80 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
16f90 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
16fa0 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c      a[pIdx->nCol
16fb0 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  umn] = 1;.  }.}.
16fc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16fd0 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
16fe0 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
16ff0 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
17000 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
17010 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
17020 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
17030 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
17040 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
17050 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
17060 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74  ame, int ifExist
17070 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  s){.  Index *pIn
17080 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
17090 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
170a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
170b0 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74  t iDb;..  assert
170c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
170d0 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20  0 );   /* Never 
170e0 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f  called with prio
170f0 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66  r errors */.  if
17100 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17110 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
17120 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
17130 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
17140 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
17150 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
17160 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
17170 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
17180 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17190 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
171a0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
171b0 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
171c0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
171d0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
171e0 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
171f0 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dex==0 ){.    if
17200 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20  ( !ifExists ){. 
17210 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17220 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
17230 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
17240 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
17250 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
17260 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
17270 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17280 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
17290 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
172a0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
172b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
172c0 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
172d0 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
172e0 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
172f0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
17300 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
17310 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
17320 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17330 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
17340 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
17350 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
17360 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
17370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17380 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
17390 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
173a0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
173b0 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
173c0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
173d0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
173e0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
173f0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
17400 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
17410 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
17420 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
17430 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
17440 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
17450 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
17460 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
17470 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17480 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
17490 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
174a0 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
174b0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
174c0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
174d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
174e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
174f0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
17500 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
17510 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
17520 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
17530 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
17540 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
17550 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
17560 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
17570 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
17580 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
17590 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
175a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
175b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
175c0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
175d0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
175e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
175f0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
17600 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
17610 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
17620 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
17630 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
17640 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
17650 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
17660 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
17670 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71     );.    if( sq
17680 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
17690 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  b, "sqlite_stat1
176a0 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ", db->aDb[iDb].
176b0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
176c0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
176d0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
176e0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
176f0 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20  %Q.sqlite_stat1 
17700 57 48 45 52 45 20 69 64 78 3d 25 51 22 2c 0a 20  WHERE idx=%Q",. 
17710 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
17720 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  Db].zName, pInde
17730 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  x->zName.      )
17740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17750 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
17760 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
17770 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
17780 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
17790 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
177a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
177b0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
177c0 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
177d0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
177e0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
177f0 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
17800 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
17810 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
17820 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
17830 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
17840 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
17850 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e    Each object in
17860 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
17870 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
17880 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f  n size.  This ro
17890 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
178a0 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20  a new.** object 
178b0 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  on the end of th
178c0 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a  e array..**.** *
178d0 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e  pnEntry is the n
178e0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
178f0 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e   already in use.
17900 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a    *pnAlloc is.**
17910 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
17920 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  allocated size o
17930 66 20 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e  f the array.  in
17940 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a  itSize is the.**
17950 20 73 75 67 67 65 73 74 65 64 20 69 6e 69 74 69   suggested initi
17960 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c  al array size al
17970 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
17980 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
17990 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 72 65   new entry is re
179a0 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e  turned in *pIdx.
179b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
179c0 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ine returns a po
179d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
179e0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
179f0 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65  This.** might be
17a00 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
17a10 20 70 41 72 72 61 79 20 70 61 72 61 6d 65 74 65   pArray paramete
17a20 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  r or it might be
17a30 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
17a40 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65 20 61  pointer if the a
17a50 72 72 61 79 20 77 61 73 20 72 65 73 69 7a 65 64  rray was resized
17a60 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
17a70 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
17a80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
17a90 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
17aa0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
17ab0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
17ac0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
17ad0 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
17ae0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
17af0 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
17b00 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
17b10 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
17b20 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
17b30 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
17b40 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20    int initSize, 
17b50 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64      /* Suggested
17b60 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
17b70 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73  ion, in elements
17b80 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74   */.  int *pnEnt
17b90 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ry,     /* Numbe
17ba0 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72  r of objects cur
17bb0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f  rently in use */
17bc0 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c  .  int *pnAlloc,
17bd0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
17be0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
17bf0 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
17c00 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  nts */.  int *pI
17c10 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
17c20 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
17c30 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
17c40 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
17c50 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79  ;.  if( *pnEntry
17c60 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a   >= *pnAlloc ){.
17c70 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a      void *pNew;.
17c80 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b      int newSize;
17c90 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28  .    newSize = (
17ca0 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e  *pnAlloc)*2 + in
17cb0 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77  itSize;.    pNew
17cc0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
17cd0 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
17ce0 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29  newSize*szEntry)
17cf0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
17d00 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  0 ){.      *pIdx
17d10 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
17d20 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20  urn pArray;.    
17d30 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d  }.    *pnAlloc =
17d40 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17d50 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 2f 73  Size(db, pNew)/s
17d60 7a 45 6e 74 72 79 3b 0a 20 20 20 20 70 41 72 72  zEntry;.    pArr
17d70 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
17d80 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
17d90 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
17da0 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74  *pnEntry * szEnt
17db0 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
17dc0 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45  ;.  *pIdx = *pnE
17dd0 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74  ntry;.  ++*pnEnt
17de0 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
17df0 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
17e00 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
17e10 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
17e20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
17e30 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
17e40 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
17e50 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
17e60 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
17e70 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
17e80 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
17e90 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
17ea0 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  ppend(sqlite3 *d
17eb0 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
17ec0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
17ed0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
17ee0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
17ef0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
17f00 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
17f10 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
17f20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
17f30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17f40 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
17f50 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 0;.  }.  pLi
17f60 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41  st->a = sqlite3A
17f70 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
17f80 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c      db,.      pL
17f90 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69  ist->a,.      si
17fa0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
17fb0 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20  ),.      5,.    
17fc0 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20    &pList->nId,. 
17fd0 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c       &pList->nAl
17fe0 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  loc,.      &i.  
17ff0 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
18000 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
18010 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
18020 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
18030 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
18040 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
18050 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
18060 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
18070 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
18080 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
18090 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
180a0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
180b0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
180c0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
180d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
180e0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
180f0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
18100 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
18110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
18120 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
18130 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
18140 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18150 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
18160 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18170 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
18180 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18190 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
181a0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
181b0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
181c0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
181d0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
181e0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
181f0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
18200 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
18210 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
18220 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
18230 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
18240 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
18250 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
18260 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
18270 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
18280 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
18290 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
182a0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
182b0 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
182c0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
182d0 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
182e0 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
182f0 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
18300 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
18310 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
18320 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
18330 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
18340 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
18350 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
18360 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
18370 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
18380 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
18390 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
183a0 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
183b0 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
183c0 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
183d0 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
183e0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
183f0 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
18400 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
18410 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
18420 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
18430 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
18440 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
18450 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
18460 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
18470 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
18480 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
18490 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
184a0 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
184b0 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
184c0 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
184d0 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
184e0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
184f0 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
18500 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
18510 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
18520 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
18530 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
18540 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
18550 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
18560 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
18570 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
18580 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
18590 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
185a0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
185b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
185c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
185d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
185e0 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
185f0 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
18600 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
18610 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
18620 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
18630 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
18640 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18650 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
18660 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
18670 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
18680 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
18690 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
186a0 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
186b0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
186c0 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
186d0 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
186e0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
186f0 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
18700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
18710 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
18720 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
18730 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
18740 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
18750 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
18760 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
18770 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
18780 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  ( pSrc->nSrc+nEx
18790 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
187a0 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
187b0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
187c0 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
187d0 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  rc+nExtra;.    i
187e0 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
187f0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
18800 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
18820 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
18830 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
18840 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
18850 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
18860 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18870 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18880 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
18890 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
188a0 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
188b0 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
188c0 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
188d0 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
188e0 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
188f0 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
18900 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
18910 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a 20 20 7d  = (u16)nGot;.  }
18920 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
18930 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
18940 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
18950 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
18960 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
18970 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
18980 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
18990 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
189a0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
189b0 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
189c0 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
189d0 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31 36 29 6e  ->nSrc += (i16)n
189e0 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
189f0 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
18a00 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
18a10 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
18a20 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
18a30 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
18a40 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
18a50 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
18a60 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
18a70 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
18a80 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
18a90 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
18aa0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
18ab0 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
18ac0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
18ad0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
18ae0 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
18af0 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
18b00 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
18b10 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
18b20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
18b30 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
18b40 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
18b50 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
18b60 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
18b70 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
18b80 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
18b90 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
18ba0 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
18bb0 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
18bc0 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
18bd0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
18be0 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
18bf0 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
18c00 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
18c10 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
18c20 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
18c30 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
18c40 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
18c50 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
18c60 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
18c70 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
18c80 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
18c90 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
18ca0 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
18cb0 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
18cc0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
18cd0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
18ce0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
18cf0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
18d00 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
18d10 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
18d20 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
18d30 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
18d40 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
18d50 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
18d60 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
18d70 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
18d80 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
18d90 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
18da0 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
18db0 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
18dc0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
18dd0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
18de0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
18df0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
18e00 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
18e10 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
18e20 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
18e30 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
18e40 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
18e50 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
18e60 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
18e70 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
18e80 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
18e90 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
18ea0 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
18eb0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
18ec0 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
18ed0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
18ee0 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
18ef0 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
18f00 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
18f10 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
18f20 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
18f30 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
18f40 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
18f50 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
18f60 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
18f70 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
18f80 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
18f90 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
18fa0 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
18fb0 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
18fc0 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
18fd0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
18fe0 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
18ff0 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
19000 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
19010 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
19020 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
19030 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
19040 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
19050 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
19060 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
19070 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
19080 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
19090 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
190a0 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
190b0 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
190c0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
190d0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
190e0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
190f0 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
19100 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
19110 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
19120 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
19130 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
19140 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
19150 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
19160 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
19170 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
19180 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19190 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
191a0 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
191b0 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
191c0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
191d0 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
191e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
191f0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
19200 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
19210 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
19220 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
19230 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
19240 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
19250 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
19260 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
19270 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
19280 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
19290 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66  ist->nSrc);.  if
192a0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
192b0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
192c0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
192d0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
192e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
192f0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
19300 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b  [pList->nSrc-1];
19310 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
19320 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
19330 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
19340 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
19350 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b  if( pDatabase ){
19360 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
19370 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
19380 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
19390 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
193a0 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
193b0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
193c0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
193d0 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
193e0 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
193f0 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
19400 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
19410 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65  pDatabase);.  re
19420 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
19430 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65  *.** Assign Vdbe
19440 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d  Cursor index num
19450 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  bers to all tabl
19460 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
19470 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
19480 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
19490 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
194a0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
194b0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
194c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
194d0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
194e0 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
194f0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19500 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
19510 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
19520 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
19530 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
19540 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
19550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
19560 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
19570 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
19580 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
19590 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
195a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
195b0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
195c0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
195d0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
195e0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
195f0 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
19600 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19610 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
19620 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
19630 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
19640 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
19650 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19660 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73  3SrcListDelete(s
19670 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
19680 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
19690 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
196a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
196b0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
196c0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
196d0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
196e0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
196f0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
19700 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
19710 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
19720 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
19730 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19740 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
19750 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
19760 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
19770 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
19780 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19790 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  pItem->zIndex);.
197a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
197b0 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54  eTable(pItem->pT
197c0 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
197d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
197e0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
197f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19800 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
19810 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
19820 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
19830 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
19840 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
19850 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
19860 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
19870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
19880 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
19890 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  er to add a new 
198a0 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65  term to the.** e
198b0 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20  nd of a growing 
198c0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
198d0 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
198e0 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a  is the part of.*
198f0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
19900 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
19910 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  dy been construc
19920 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c  ted.  "p" is NUL
19930 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  L.** if this is 
19940 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
19950 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
19960 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70  e.  pTable and p
19970 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20  Database.** are 
19980 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
19990 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61  table and databa
199a0 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  se named in the 
199b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
199c0 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69  ..** pDatabase i
199d0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61  s NULL if the da
199e0 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c  tabase name qual
199f0 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67  ifier is missing
19a00 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20   - the.** usual 
19a10 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65  case.  If the te
19a20 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20  rm has a alias, 
19a30 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
19a40 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
19a50 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
19a60 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
19a70 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
19a80 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
19a90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19aa0 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
19ab0 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
19ac0 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
19ad0 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
19ae0 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
19af0 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
19b00 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
19b10 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
19b20 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
19b30 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
19b40 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
19b50 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
19b60 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
19b70 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
19b80 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
19b90 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
19ba0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
19bb0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
19bc0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
19bd0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
19be0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
19bf0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
19c00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19c10 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
19c20 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19c30 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
19c40 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
19c50 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
19c60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
19c70 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
19c80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
19c90 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
19ca0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
19cb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19cc0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
19cd0 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
19ce0 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
19cf0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
19d00 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
19d10 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
19d20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
19d30 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
19d40 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
19d50 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
19d60 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
19d70 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
19d80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
19d90 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
19da0 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
19db0 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
19dc0 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
19dd0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
19de0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
19df0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
19e00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19e10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
19e20 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
19e30 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
19e40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19e50 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
19e60 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
19e70 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
19e80 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
19e90 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
19ea0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
19eb0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
19ec0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
19ed0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
19ee0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
19ef0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
19f00 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
19f10 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nSrc==0) ){.    
19f20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
19f30 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49  _error;.  }.  pI
19f40 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
19f50 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Src-1];.  assert
19f60 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
19f70 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
19f80 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
19f90 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
19fa0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
19fb0 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
19fc0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
19fd0 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
19fe0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
19ff0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
1a000 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
1a010 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
1a020 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
1a030 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
1a040 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a050 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
1a060 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1a070 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
1a080 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1a090 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
1a0a0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1a0b0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
1a0c0 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
1a0d0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
1a0e0 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
1a0f0 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
1a100 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
1a110 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
1a120 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1a130 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
1a140 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
1a150 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
1a160 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1a170 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
1a180 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
1a190 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
1a1a0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57  ;.  if( p && ALW
1a1b0 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29  AYS(p->nSrc>0) )
1a1c0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1a1d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a1e0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1a1f0 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
1a200 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1a210 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e  ed==0 && pItem->
1a220 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  zIndex==0 );.   
1a230 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
1a240 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
1a250 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
1a260 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
1a270 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
1a280 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
1a290 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
1a2a0 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
1a2b0 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
1a2c0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
1a2d0 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  em->notIndexed =
1a2e0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1a2f0 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64       pItem->zInd
1a300 65 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ex = sqlite3Name
1a310 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1a320 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
1a330 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1a340 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
1a350 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
1a360 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
1a370 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
1a380 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
1a390 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
1a3a0 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
1a3b0 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
1a3c0 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
1a3d0 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
1a3e0 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
1a3f0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
1a400 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1a410 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
1a420 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
1a430 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1a440 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
1a450 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
1a460 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
1a470 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
1a480 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
1a490 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
1a4a0 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
1a4b0 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
1a4c0 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
1a4d0 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
1a4e0 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
1a4f0 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
1a500 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
1a510 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
1a520 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
1a530 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
1a540 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
1a550 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
1a560 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
1a570 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
1a580 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
1a590 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1a5a0 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
1a5b0 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
1a5c0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20    if( p && p->a 
1a5d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1a5e0 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
1a5f0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1a600 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e      p->a[i].join
1a610 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
1a620 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1a630 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69  .    p->a[0].joi
1a640 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1a650 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1a660 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1a670 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1a680 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1a690 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
1a6a0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
1a6b0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1a6c0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
1a6d0 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1a6e0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1a6f0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
1a700 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64  !=0 );./*  if( d
1a710 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1a720 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20   ) return; */.  
1a730 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a740 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1a750 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1a760 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1a770 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1a780 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1a790 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1a7a0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
1a7b0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
1a7c0 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
1a7d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
1a7e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1a7f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a800 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
1a810 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
1a820 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
1a830 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1a840 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
1a850 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1a860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a870 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1a880 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
1a890 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
1a8a0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1a8b0 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
1a8c0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1a8d0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1a8e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1a8f0 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
1a900 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1a910 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a920 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1a930 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1a940 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1a950 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1a960 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1a970 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1a980 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
1a990 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
1a9a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1a9b0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1a9c0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1a9d0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1a9e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a9f0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1aa00 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
1aa10 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1aa20 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1aa30 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
1aa40 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
1aa50 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1aa60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1aa70 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1aa80 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1aa90 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1aaa0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
1aab0 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20  b!=0 );./*  if( 
1aac0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
1aad0 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20  0 ) return; */. 
1aae0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1aaf0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1ab00 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1ab10 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
1ab20 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1ab30 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1ab40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1ab50 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1ab60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ab70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1ab80 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
1ab90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1aba0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1abb0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1abc0 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
1abd0 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
1abe0 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
1abf0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
1ac00 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
1ac10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1ac20 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
1ac30 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
1ac40 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
1ac50 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
1ac60 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1ac70 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1ac80 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
1ac90 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
1aca0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1acb0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
1acc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1acd0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1ace0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1acf0 63 68 61 72 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22  char *az[] = { "
1ad00 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45  BEGIN", "RELEASE
1ad10 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b  ", "ROLLBACK" };
1ad20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41  .    assert( !SA
1ad30 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26  VEPOINT_BEGIN &&
1ad40 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1ad50 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49  SE==1 && SAVEPOI
1ad60 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29  NT_ROLLBACK==2 )
1ad70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1ad80 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75   !v || sqlite3Au
1ad90 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1ada0 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
1adb0 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c  , az[op], zName,
1adc0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
1add0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1ade0 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
1adf0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1ae00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1ae10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
1ae20 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c  avepoint, op, 0,
1ae30 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59   0, zName, P4_DY
1ae40 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
1ae50 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1ae60 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
1ae70 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
1ae80 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
1ae90 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
1aea0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
1aeb0 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
1aec0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
1aed0 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
1aee0 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
1aef0 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
1af00 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1af10 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1af20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1af30 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1af40 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
1af50 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1af60 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 74    int rc;.    st
1af70 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66  atic const int f
1af80 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20  lags = .        
1af90 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1afa0 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
1afb0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1afc0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
1afd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1afe0 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
1aff0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1b000 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
1b010 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1b020 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
1b030 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b040 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62  3BtreeFactory(db
1b050 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44  , 0, 0, SQLITE_D
1b060 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
1b070 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20  E, flags,.      
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 20 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e             &db->
1b0a0 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
1b0b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b0c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1b0d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b0e0 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
1b0f0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
1b100 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
1b110 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
1b120 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
1b130 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
1b140 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
1b150 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b160 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b170 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
1b180 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
1b190 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
1b1a0 6d 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  mit );.    asser
1b1b0 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
1b1c0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
1b1d0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
1b1e0 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
1b1f0 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 31  ePager(db->aDb[1
1b200 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b220 20 20 20 20 64 62 2d 3e 64 66 6c 74 4a 6f 75 72      db->dfltJour
1b230 6e 61 6c 4d 6f 64 65 29 3b 0a 20 20 7d 0a 20 20  nalMode);.  }.  
1b240 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1b250 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1b260 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1b270 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
1b280 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
1b290 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
1b2a0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
1b2b0 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
1b2c0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
1b2d0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1b2e0 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
1b2f0 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
1b300 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
1b310 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
1b320 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1b330 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
1b340 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
1b350 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
1b360 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
1b370 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
1b380 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
1b390 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
1b3a0 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
1b3b0 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
1b3c0 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
1b3d0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1b3e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1b3f0 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
1b400 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
1b410 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
1b420 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
1b430 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
1b440 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
1b450 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
1b460 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
1b470 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
1b480 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
1b490 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
1b4a0 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
1b4b0 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
1b4c0 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
1b4d0 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
1b4e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
1b4f0 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
1b500 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
1b510 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
1b520 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
1b530 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
1b540 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
1b550 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
1b560 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1b570 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1b580 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
1b590 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
1b5a0 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
1b5b0 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
1b5c0 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
1b5d0 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
1b5e0 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
1b5f0 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
1b600 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
1b610 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
1b620 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
1b630 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
1b640 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
1b650 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
1b660 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
1b670 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
1b680 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
1b690 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
1b6a0 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
1b6b0 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
1b6c0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1b6d0 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1b6e0 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
1b6f0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1b700 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1b710 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1b720 29 3b 0a 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  );..  if( pTople
1b730 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  vel->cookieGoto=
1b740 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
1b750 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1b760 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  be(pToplevel);. 
1b770 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
1b780 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
1b790 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
1b7a0 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
1b7b0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54   error */.    pT
1b7c0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47  oplevel->cookieG
1b7d0 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
1b7e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b7f0 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
1b800 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
1b810 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
1b820 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62   = pToplevel->db
1b830 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  ;.    int mask;.
1b840 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
1b850 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
1b860 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1b870 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
1b880 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
1b890 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
1b8a0 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
1b8b0 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c  ;.    mask = 1<<
1b8c0 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54  iDb;.    if( (pT
1b8d0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
1b8e0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
1b8f0 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  {.      pTopleve
1b900 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  l->cookieMask |=
1b910 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f   mask;.      pTo
1b920 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61  plevel->cookieVa
1b930 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
1b940 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1b950 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
1b960 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
1b970 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1b980 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b990 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
1b9a0 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
1b9b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b9c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1b9d0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
1b9e0 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
1b9f0 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
1ba00 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
1ba10 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
1ba20 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
1ba30 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
1ba40 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1ba50 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
1ba60 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
1ba70 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
1ba80 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
1ba90 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
1baa0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
1bab0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
1bac0 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
1bad0 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
1bae0 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
1baf0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
1bb00 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
1bb10 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
1bb20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
1bb30 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
1bb40 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
1bb50 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
1bb60 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
1bb70 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
1bb80 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
1bb90 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
1bba0 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
1bbb0 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
1bbc0 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
1bbd0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
1bbe0 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
1bbf0 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
1bc00 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
1bc10 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
1bc20 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
1bc30 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
1bc40 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
1bc50 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
1bc60 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a   not be set..*/.
1bc70 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
1bc80 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1bc90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1bca0 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
1bcb0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
1bcc0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1bcd0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1bce0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1bcf0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1bd00 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1bd10 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
1bd20 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  l->writeMask |= 
1bd30 31 3c 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65  1<<iDb;.  pTople
1bd40 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
1bd50 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
1bd60 74 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74  t;.}../* .** Set
1bd70 20 74 68 65 20 22 6d 61 79 20 74 68 72 6f 77 20   the "may throw 
1bd80 61 62 6f 72 74 20 65 78 63 65 70 74 69 6f 6e 22  abort exception"
1bd90 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 73 74   flag for the st
1bda0 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
1bdb0 79 20 0a 2a 2a 20 62 65 69 6e 67 20 63 6f 64 65  y .** being code
1bdc0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1bdd0 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
1bde0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
1bdf0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1be00 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1be10 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1be20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
1be30 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
1be40 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
1be50 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
1be60 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
1be70 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
1be80 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
1be90 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
1bea0 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
1beb0 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
1bec0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
1bed0 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
1bee0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1bef0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1bf00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
1bf10 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 72  ltConstraint(Par
1bf20 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1bf30 6f 6e 45 72 72 6f 72 2c 20 63 68 61 72 20 2a 70  onError, char *p
1bf40 34 2c 20 69 6e 74 20 70 34 74 79 70 65 29 7b 0a  4, int p4type){.
1bf50 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1bf60 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1bf70 65 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f  e);.  if( onErro
1bf80 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
1bf90 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
1bfa0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
1bfb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bfc0 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
1bfd0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1bfe0 54 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  T, onError, 0, p
1bff0 34 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f  4, p4type);.}../
1c000 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
1c010 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
1c020 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1c030 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1c040 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
1c050 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
1c060 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
1c070 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
1c080 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1c090 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
1c0a0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
1c0b0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
1c0c0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
1c0d0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1c0e0 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
1c0f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
1c100 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
1c110 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c120 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
1c130 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
1c140 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1c150 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
1c160 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c  StrICmp(z, zColl
1c170 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1c180 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1c190 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c1a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1c1b0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1c1c0 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
1c1d0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1c1e0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
1c1f0 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
1c200 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
1c210 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1c220 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
1c230 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1c240 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1c250 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
1c260 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
1c270 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
1c280 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
1c290 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1c2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1c2b0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1c2c0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1c2d0 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1c2e0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1c2f0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1c300 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1c310 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1c320 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1c330 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1c340 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1c350 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1c360 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1c370 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1c380 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1c390 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1c3a0 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1c3b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1c3c0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1c3d0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1c3e0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1c3f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1c400 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1c410 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1c420 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1c430 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1c440 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1c450 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1c460 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1c470 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1c480 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1c490 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1c4a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c4b0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1c4c0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1c4d0 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1c4e0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1c4f0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1c500 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1c510 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1c520 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1c530 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c550 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1c560 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1c570 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1c580 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1c590 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1c5a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1c5b0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1c5c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1c5d0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1c5e0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1c5f0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1c600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1c610 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1c620 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
1c630 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1c640 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1c650 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1c660 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1c670 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1c680 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1c690 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1c6a0 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1c6b0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1c6c0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1c6d0 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1c6e0 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1c6f0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1c700 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1c710 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1c720 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1c730 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1c740 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1c750 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1c760 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1c790 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1c7a0 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1c7b0 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1c7c0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1c7d0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1c7e0 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1c7f0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1c800 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1c810 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1c820 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1c830 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1c840 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1c850 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1c860 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1c870 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1c880 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1c890 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1c8a0 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1c8b0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1c8c0 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1c8d0 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1c8e0 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1c8f0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1c900 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1c910 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1c920 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c930 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1c940 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1c950 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1c960 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1c970 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1c980 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1c990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1c9a0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c9b0 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1c9c0 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1c9d0 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c9f0 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1ca00 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1ca10 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1ca20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ca30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ca40 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1ca50 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1ca60 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1ca70 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1ca80 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1caa0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1cab0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1cac0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1caf0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1cb00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1cb10 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1cb20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1cb30 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1cb40 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1cb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1cb60 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1cb70 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1cb80 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1cb90 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1cba0 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1cbb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1cbc0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1cbd0 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1cbe0 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1cbf0 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1cc00 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1cc10 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1cc20 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1cc30 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1cc40 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1cc50 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1cc60 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1cc70 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1cc80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
1cc90 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
1cca0 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
1ccb0 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
1ccc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1ccd0 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
1cce0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
1ccf0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1cd00 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
1cd10 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1cd20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
1cd30 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1cd40 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1cd50 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
1cd60 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1cd70 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
1cd80 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1cd90 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
1cda0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1cdb0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
1cdc0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1cdd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cde0 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
1cdf0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1ce00 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1ce10 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1ce20 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1ce30 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1ce40 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1ce50 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1ce60 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
1ce70 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1ce80 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
1ce90 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1cea0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1ceb0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
1cec0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
1ced0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
1cee0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1cef0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
1cf00 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1cf10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1cf20 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1cf30 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1cf40 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1cf50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
1cf60 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1cf70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1cf80 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1cf90 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1cfa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
1cfb0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1cfc0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1cfd0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1cfe0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1cff0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1d000 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1d010 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
1d020 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
1d030 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1d040 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c   a dynamicly all
1d050 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73  ocated KeyInfo s
1d060 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61  tructure that ca
1d070 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
1d080 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  h OP_OpenRead or
1d090 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f   OP_OpenWrite to
1d0a0 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
1d0b0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
1d0c0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1d0d0 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
1d0e0 68 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65  he new structure
1d0f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
1d100 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
1d110 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1d120 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1d130 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1d140 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72  e(db, ) on the r
1d150 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1d160 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1d170 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1d180 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1d190 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1d1a0 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1d1b0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1d1c0 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1d1d0 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1d1e0 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1d1f0 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1d200 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1d210 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1d220 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1d230 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1d240 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1d250 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1d260 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1d270 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1d280 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1d290 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69  ) + nCol;.  sqli
1d2a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1d2b0 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
1d2c0 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1d2d0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1d2e0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
1d2f0 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20  s);..  if( pKey 
1d300 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20  ){.    pKey->db 
1d310 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1d320 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1d330 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1d340 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1d350 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1d360 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1d370 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1d380 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1d390 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d3a0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1d3b0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1d3c0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1d3d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1d3e0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1d3f0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1d400 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1d410 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1d420 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
1d430 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1d440 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1d450 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1d460 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Key->nField = (u
1d470 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20  16)nCol;.  }..  
1d480 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1d490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1d4a0 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b  bFree(db, pKey);
1d4b0 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20  .    pKey = 0;. 
1d4c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
1d4d0 3b 0a 7d 0a                                      ;.}.