/ Hex Artifact Content
Login

Artifact 5269733241f459705189aa39f4eacf18b10d7661:


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 70 50 61 72 73 65 2d 3e  assert( pParse->
1070: 69 73 4d 75 6c 74 69 57 72 69 74 65 3d 3d 30 20  isMultiWrite==0 
1080: 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  || sqlite3VdbeMa
1090: 79 41 62 6f 72 74 28 76 29 3d 3d 70 50 61 72 73  yAbort(v)==pPars
10a0: 65 2d 3e 6d 61 79 41 62 6f 72 74 20 29 3b 0a 20  e->mayAbort );. 
10b0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
10c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
10d0: 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 0a 20 20  v, OP_Halt);..  
10e0: 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20    /* The cookie 
10f0: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  mask contains on
1100: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64  e bit for each d
1110: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
1120: 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30  n..    ** (Bit 0
1130: 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69   is for main, bi
1140: 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c  t 1 is for temp,
1150: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20   and so forth.) 
1160: 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a   Bits are.    **
1170: 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61   set for each da
1180: 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75  tabase that is u
1190: 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63  sed.  Generate c
11a0: 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20  ode to start a. 
11b0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
11c0: 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64  n on each used d
11d0: 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76  atabase and to v
11e0: 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
11f0: 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f   cookie.    ** o
1200: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
1210: 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
1220: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
1230: 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20  kieGoto>0 ){.   
1240: 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20     u32 mask;.   
1250: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1270: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1280: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1290: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
12a0: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12b0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12c0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12d0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12e0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1310: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1320: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1340: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1350: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1360: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1370: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1380: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b0: 32 28 76 2c 4f 50 5f 56 65 72 69 66 79 43 6f 6f  2(v,OP_VerifyCoo
13c0: 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65  kie, iDb, pParse
13d0: 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
13e0: 62 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  b]);.        }. 
13f0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
1400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1410: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 7b 0a  ALTABLE.      {.
1420: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1430: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1440: 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c  i<pParse->nVtabL
1450: 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ock; i++){.     
1460: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
1470: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1480: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
1490: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
14a0: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  k[i]);.         
14b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c0: 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c  p4(v, OP_VBegin,
14d0: 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20   0, 0, 0, vtab, 
14e0: 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20  P4_VTAB);.      
14f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72    }.        pPar
1500: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20  se->nVtabLock = 
1510: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
1520: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65  f..      /* Once
1530: 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73   all the cookies
1540: 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69 66   have been verif
1550: 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63 74  ied and transact
1560: 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20  ions opened, .  
1570: 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68      ** obtain th
1580: 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
1590: 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73 20  -locks. This is 
15a0: 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74  a no-op unless t
15b0: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68 61  he .      ** sha
15c0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
15d0: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  e is enabled..  
15e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64      */.      cod
15f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72  eTableLocks(pPar
1600: 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  se);..      /* I
1610: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41 55  nitialize any AU
1620: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74 61  TOINCREMENT data
1630: 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71 75   structures requ
1640: 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ired..      */. 
1650: 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f       sqlite3Auto
1660: 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28 70  incrementBegin(p
1670: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  Parse);..      /
1680: 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20  * Finally, jump 
1690: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
16a0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 65 78 65  nning of the exe
16b0: 63 75 74 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f  cutable code. */
16c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16e0: 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  oto, 0, pParse->
16f0: 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20  cookieGoto);.   
1700: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65   }.  }...  /* Ge
1710: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
1720: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
1730: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
1740: 28 20 76 20 26 26 20 41 4c 57 41 59 53 28 70 50  ( v && ALWAYS(pP
1750: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26  arse->nErr==0) &
1760: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
1770: 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20 53 51  led ){.#ifdef SQ
1780: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 46  LITE_DEBUG.    F
1790: 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62  ILE *trace = (db
17a0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
17b0: 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f  _VdbeTrace)!=0 ?
17c0: 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20   stdout : 0;.   
17d0: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
17e0: 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23 65 6e  e(v, trace);.#en
17f0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
1800: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1810: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1820: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1830: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1840: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1850: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1860: 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d  e->nVar, pParse-
1870: 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >nMem,.         
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2c 20 70 50  pParse->nTab, pP
18a0: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 2c 20 70  arse->nMaxArg, p
18b0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 2c 0a  Parse->explain,.
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
18e0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26  >isMultiWrite &&
18f0: 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72   pParse->mayAbor
1900: 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  t);.    pParse->
1910: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1920: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  ;.    pParse->co
1930: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20  lNamesSet = 0;. 
1940: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73   }else if( pPars
1950: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
1960: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1980: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
1990: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
19a0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
19b0: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
19c0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
19d0: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
19e0: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
19f0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
1a00: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
1a10: 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73  .** Run the pars
1a20: 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  er and code gene
1a30: 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c  rator recursivel
1a40: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  y in order to ge
1a50: 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66  nerate.** code f
1a60: 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  or the SQL state
1a70: 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20  ment given onto 
1a80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1a90: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a  Parse context.**
1aa0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1ab0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
1ac0: 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20  When the parser 
1ad0: 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65  is run recursive
1ae0: 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20  ly.** this way, 
1af0: 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c  the final OP_Hal
1b00: 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65  t is not appende
1b10: 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74  d and other init
1b20: 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  ialization.** an
1b30: 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73  d finalization s
1b40: 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64  teps are omitted
1b50: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61   because those a
1b60: 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74  re handling by t
1b70: 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20  he.** outermost 
1b80: 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  parser..**.** No
1b90: 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  t everything is 
1ba0: 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20  nestable.  This 
1bb0: 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69  facility is desi
1bc0: 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a  gned to permit.*
1bd0: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
1be0: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65  , and DELETE ope
1bf0: 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20  rations against 
1c00: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20  SQLITE_MASTER.  
1c10: 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79  Use.** care if y
1c20: 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79  ou decide to try
1c30: 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75   to use this rou
1c40: 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  tine for some ot
1c50: 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f  her purposes..*/
1c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73  .void sqlite3Nes
1c70: 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a  tedParse(Parse *
1c80: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1c90: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1ca0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1cb0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1cc0: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
1cd0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
1ce0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1cf0: 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a  # define SAVE_SZ
1d00: 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29    (sizeof(Parse)
1d10: 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73   - offsetof(Pars
1d20: 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20  e,nVar)).  char 
1d30: 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d  saveBuf[SAVE_SZ]
1d40: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
1d50: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1d60: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1d70: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
1d80: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
1d90: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
1da0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
1db0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
1dc0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
1dd0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
1de0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
1df0: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1e00: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
1e10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
1e20: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
1e30: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1e40: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
1e50: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
1e60: 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73 65  saveBuf, &pParse
1e70: 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29  ->nVar, SAVE_SZ)
1e80: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72  ;.  memset(&pPar
1e90: 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56  se->nVar, 0, SAV
1ea0: 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33  E_SZ);.  sqlite3
1eb0: 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73 65  RunParser(pParse
1ec0: 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67  , zSql, &zErrMsg
1ed0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1ee0: 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1ef0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f00: 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65  (db, zSql);.  me
1f10: 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56  mcpy(&pParse->nV
1f20: 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56  ar, saveBuf, SAV
1f30: 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d  E_SZ);.  pParse-
1f40: 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a  >nested--;.}../*
1f50: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1f60: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1f70: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1f80: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
1f90: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
1fa0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1fb0: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
1fc0: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
1fd0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1fe0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
1ff0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
2000: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
2010: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2020: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2030: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2040: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2050: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
2060: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  d the.** first m
2070: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73  atching table is
2080: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
2090: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
20a0: 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  licate table.** 
20b0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
20c0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
20d0: 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c  r is TEMP first,
20e0: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
20f0: 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72   any.** auxiliar
2100: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2110: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
2120: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
2130: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
2140: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
2150: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2160: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
2170: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2180: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2190: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
21a0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
21b0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
21c0: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73 65  nt nName;.  asse
21d0: 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a  rt( zName!=0 );.
21e0: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
21f0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
2200: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2210: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2230: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2240: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
2250: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
2260: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
2270: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
2280: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
2290: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
22a0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
22b0: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
22c0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
22d0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
22e0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
22f0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
2300: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
2310: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2320: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2330: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2340: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2350: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2360: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2370: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2380: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2390: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
23a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
23b0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
23c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
23d0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
23e0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
23f0: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
2400: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2410: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
2430: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
2440: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
2450: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2460: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2470: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
2480: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2490: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
24a0: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
24b0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
24c0: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
24d0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
24e0: 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  ateTable(.  Pars
24f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2500: 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e     /* context in
2510: 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74   which to report
2520: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2530: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 20 20   isView,        
2540: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
2550: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45  ooking for a VIE
2560: 57 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  W rather than a 
2570: 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  TABLE */.  const
2580: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
2590: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25a0: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f   table we are lo
25b0: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63  oking for */.  c
25c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73  onst char *zDbas
25d0: 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e     /* Name of
25e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
25f0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
2600: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
2610: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
2620: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
2630: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2640: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
2650: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
2660: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
2670: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
2680: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
2690: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
26a0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
26b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26c0: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
26d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
26e0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
26f0: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28  , zDbase);.  if(
2700: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e   p==0 ){.    con
2710: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20  st char *zMsg = 
2720: 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63  isView ? "no suc
2730: 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75  h view" : "no su
2740: 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69  ch table";.    i
2750: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2760: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2770: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
2780: 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44  %s.%s", zMsg, zD
2790: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
27a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
27b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27c0: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c  Parse, "%s: %s",
27d0: 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20   zMsg, zName);. 
27e0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
27f0: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
2800: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2820: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2830: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2840: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
2850: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
2860: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2870: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
2880: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
2890: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
28a0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
28b0: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
28c0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
28d0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
28e0: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
28f0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
2900: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
2910: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
2920: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
2930: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
2940: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
2950: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
2960: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
2970: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
2980: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
2990: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
29a0: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
29b0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
29c0: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
29d0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
29e0: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
29f0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
2a00: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2a10: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2a30: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
2a40: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
2a50: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
2a60: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
2a70: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2a80: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2a90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2aa0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2ab0: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
2ac0: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
2ad0: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
2ae0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
2af0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
2b00: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
2b10: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  a );.    if( zDb
2b20: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2b30: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
2b40: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
2b50: 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71  inue;.    p = sq
2b60: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
2b70: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
2b80: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
2b90: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2ba0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2bb0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
2bc0: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
2bd0: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
2be0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2bf0: 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  reeIndex(Index *
2c00: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
2c10: 62 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64  b = p->pTable->d
2c20: 62 4d 65 6d 3b 0a 20 20 2f 2a 20 74 65 73 74 63  bMem;.  /* testc
2c30: 61 73 65 28 20 64 62 3d 3d 30 20 29 3b 20 2a 2f  ase( db==0 ); */
2c40: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
2c50: 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 70 29 3b  IndexSamples(p);
2c60: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2c70: 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29  (db, p->zColAff)
2c80: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2c90: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
2ca0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
2cb0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
2cc0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2cd0: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
2ce0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
2cf0: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
2d00: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
2d10: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
2d20: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
2d30: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
2d40: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
2d50: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
2d60: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
2d70: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
2d80: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
2d90: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
2da0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
2db0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2dc0: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 28 49  te3DeleteIndex(I
2dd0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65  ndex *p){.  Inde
2de0: 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74  x *pOld;.  const
2df0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2e00: 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64  ->zName;..  pOld
2e10: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2e20: 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61  sert(&p->pSchema
2e30: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
2e40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2e60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2e70: 6d 65 29 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  me), 0);.  asser
2e80: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
2e90: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49  ld==p );.  freeI
2ea0: 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ndex(p);.}../*.*
2eb0: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
2ec0: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
2ed0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
2ee0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
2ef0: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
2f00: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
2f10: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
2f20: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
2f30: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
2f40: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
2f50: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
2f60: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
2f70: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
2f80: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
2f90: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
2fa0: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
2fb0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
2fc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2fd0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
2fe0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20   *pIndex;.  int 
2ff0: 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  len;.  Hash *pHa
3000: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
3010: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
3020: 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  ash;..  len = sq
3030: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
3040: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
3050: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3060: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3070: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3080: 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
3090: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
30a0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
30b0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
30c0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
30d0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
30e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
30f0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
3100: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  p;.      /* Just
3110: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
3120: 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65  AYS();  The inde
3130: 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65  x must be on the
3140: 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a   list of.      *
3150: 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20  * indices. */.  
3160: 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e      p = pIndex->
3170: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a  pTable->pIndex;.
3180: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
3190: 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65  AYS(p) && p->pNe
31a0: 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20  xt!=pIndex ){ p 
31b0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
31c0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
31d0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
31e0: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
31f0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
3200: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
3210: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
3220: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
3230: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
3240: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
3250: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3260: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
3270: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
3280: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
3290: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
32a0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74  .** a single dat
32b0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
32c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
32d0: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
32e0: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64  .** before the d
32f0: 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20  atabase closes. 
3300: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
3310: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
3320: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
3330: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
3340: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
3350: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69  transaction or i
3360: 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f  f a.** schema-co
3370: 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63  okie mismatch oc
3380: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  curs..**.** If i
3390: 44 62 3d 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db==0 then reset
33a0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
33b0: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
33c0: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
33d0: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
33e0: 31 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  1 then reset the
33f0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
3400: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
3410: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
3420: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
3430: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
3440: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
3450: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
3460: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
3470: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
3480: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
3490: 0a 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29  ..  if( iDb==0 )
34a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
34b0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
34c0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b    }.  for(i=iDb;
34d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
34e0: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
34f0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3500: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
3510: 61 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  a ){.      asser
3520: 74 28 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e  t(i==1 || (pDb->
3530: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
3540: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44  reeHoldsMutex(pD
3550: 62 2d 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20  b->pBt)));.     
3560: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72   sqlite3SchemaFr
3570: 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ee(pDb->pSchema)
3580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3590: 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb>0 ) return;.
35a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44    }.  assert( iD
35b0: 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  b==0 );.  db->fl
35c0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
35d0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
35e0: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
35f0: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
3600: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
3610: 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  l(db);..  /* If 
3620: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
3630: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
3640: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
3650: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
3660: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
3670: 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  em from the auxi
3680: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
3690: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
36a0: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
36b0: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
36c0: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
36d0: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
36e0: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
36f0: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
3700: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
3710: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
3720: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
3730: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
3740: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
3750: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3760: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3770: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3780: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3790: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
37a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
37b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
37c0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
37d0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
37e0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
37f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3800: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3810: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3820: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3830: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
3840: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
3850: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
3860: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
3870: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
3880: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
3890: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
38a0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
38b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
38c0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
38d0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
38e0: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
38f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3900: 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64   db->aDb);.    d
3910: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
3920: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
3930: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3940: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
3950: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
3960: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3970: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
3980: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
3990: 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  db){.  db->flags
39a0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
39b0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
39c0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
39d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
39e0: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e  a table or view.
39f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3a00: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
3a10: 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54  nNames(Table *pT
3a20: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
3a30: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
3a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3a50: 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20  pTable->dbMem;. 
3a60: 20 74 65 73 74 63 61 73 65 28 20 64 62 3d 3d 30   testcase( db==0
3a70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
3a80: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3a90: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3aa0: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3ab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3ac0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3ad0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3ae0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3af0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3b00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3b10: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
3b20: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
3b30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3b40: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
3b50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3b60: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70  e(db, pCol->zTyp
3b70: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3b80: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3b90: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
3ba0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3bb0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
3bc0: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ol);.  }.  pTabl
3bd0: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
3be0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
3bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3c00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3c10: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3c20: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3c30: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3c40: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3c50: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3c60: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3c70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c80: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3c90: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3ca0: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3cb0: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3cc0: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3cd0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3ce0: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3cf0: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3d00: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3d10: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3d20: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3d30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3d40: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3d50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3d60: 65 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65  eleteTable(Table
3d70: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64   *pTable){.  Ind
3d80: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
3d90: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
3da0: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 20  y, *pNextFKey;. 
3db0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
3dc0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
3dd0: 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
3de0: 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20  pTable->dbMem;. 
3df0: 20 74 65 73 74 63 61 73 65 28 20 64 62 3d 3d 30   testcase( db==0
3e00: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   );..  /* Do not
3e10: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
3e20: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
3e30: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3e40: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70  hes zero. */.  p
3e50: 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Table->nRef--;. 
3e60: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65   if( pTable->nRe
3e70: 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  f>0 ){.    retur
3e80: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3e90: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30   pTable->nRef==0
3ea0: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
3eb0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3ec0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3ed0: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
3ee0: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
3ef0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
3f00: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
3f10: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3f20: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3f30: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
3f40: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
3f50: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
3f60: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49    sqlite3DeleteI
3f70: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
3f80: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3f90: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
3fa0: 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  EY.  /* Delete a
3fb0: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
3fc0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3fd0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
3fe0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
3ff0: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
4000: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
4010: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
4020: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
4030: 72 6f 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rom;.    sqlite3
4040: 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
4050: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
4060: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
4070: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
4080: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
4090: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
40a0: 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20  ames(pTable);.  
40b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40c0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
40d0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
40e0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
40f0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
4100: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
4110: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
4120: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
4130: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
4140: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4150: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43  e(db, pTable->pC
4160: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
4170: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
4180: 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  (pTable);.  sqli
4190: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
41a0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
41b0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
41c0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
41d0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
41e0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
41f0: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4200: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4210: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4220: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4230: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4240: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4250: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4260: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4270: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4280: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4290: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
42a0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
42b0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
42c0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
42d0: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54  ( zTabName && zT
42e0: 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70  abName[0] );.  p
42f0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
4300: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
4310: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
4320: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
4330: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20  sh, zTabName,.  
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
4360: 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2c  len30(zTabName),
4370: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  0);.  sqlite3Del
4380: 65 74 65 54 61 62 6c 65 28 70 29 3b 0a 20 20 64  eteTable(p);.  d
4390: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
43a0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
43b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
43c0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
43d0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
43e0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
43f0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
4400: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
4410: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
4420: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
4430: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4440: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
4450: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
4460: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
4470: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4480: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
4490: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
44a0: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
44b0: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
44c0: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
44d0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
44e0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
44f0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
4500: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
4510: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
4520: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
4530: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
4540: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
4550: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
4560: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
4570: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
4580: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
4590: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
45a0: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
45b0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
45c0: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
45d0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
45e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
45f0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
4600: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
4610: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4620: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
4630: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
4640: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
4650: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
4660: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
4670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
4680: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
4690: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
46a0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
46b0: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
46c0: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
46d0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
46e0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
46f0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
4700: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
4710: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
4720: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
4730: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
4740: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
4750: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
4760: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
4770: 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41  _ROOT, 1, SCHEMA
4780: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
4790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
47a0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
47b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
47c0: 54 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  T, iDb);.  sqlit
47d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
47e0: 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c  , -1, (char *)5,
47f0: 20 50 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20   P4_INT32);  /* 
4800: 35 20 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a  5 column table *
4810: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d  /.  if( p->nTab=
4820: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61  =0 ){.    p->nTa
4830: 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b = 1;.  }.}../*
4840: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
4850: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ame points to a 
4860: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62  nul-terminated b
4870: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
4880: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
4890: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
48a0: 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68  n", "temp" or th
48b0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
48c0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a  ached db). This.
48d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
48e0: 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66  rns the index of
48f0: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4900: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4910: 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68  , or.** -1 if th
4920: 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f  e named db canno
4930: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
4940: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4950: 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Name(sqlite3 *db
4960: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4970: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4980: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  -1;         /* D
4990: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
49a0: 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  /.  if( zName ){
49b0: 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  .    Db *pDb;.  
49c0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
49d0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
49e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
49f0: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
4a00: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
4a10: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
4a20: 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45     if( (!OMIT_TE
4a30: 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26  MPDB || i!=1 ) &
4a40: 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  & n==sqlite3Strl
4a50: 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29  en30(pDb->zName)
4a60: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30   && .          0
4a70: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
4a80: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
4a90: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
4aa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4ab0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4ac0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   i;.}../*.** The
4ad0: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
4ae0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
4af0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
4b00: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
4b10: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
4b20: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4b30: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
4b40: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
4b50: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
4b60: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4b70: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4b80: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
4b90: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
4ba0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
4bb0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
4bc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
4bd0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
4be0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
4c10: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
4c20: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c40: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
4c50: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  arching for */. 
4c60: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
4c70: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
4c80: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20  , pName);.  i = 
4c90: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
4ca0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
4cb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4cc0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
4cd0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
4ce0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
4cf0: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
4d00: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
4d10: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
4d20: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4d30: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4d40: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4d50: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4d60: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4d70: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4d80: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
4d90: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
4da0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4db0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4dc0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
4dd0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
4de0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
4df0: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
4e00: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
4e10: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
4e20: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4e30: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4e40: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4e50: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4e60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4e70: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
4e80: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
4e90: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
4ea0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
4eb0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
4ec0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
4ed0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
4ee0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
4ef0: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
4f00: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
4f10: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
4f20: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4f30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4f40: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4f50: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4f60: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4f70: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
4f80: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
4f90: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4fa0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
4fb0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
4fc0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
4fd0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
4fe0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
4ff0: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
5000: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
5010: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
5020: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
5030: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5050: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
5060: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
5070: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5080: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
5090: 28 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21  ( ALWAYS(pName2!
50a0: 3d 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  =0) && pName2->n
50b0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  >0 ){.    if( db
50c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a  ->init.busy ) {.
50d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
50e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
50f0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22  orrupt database"
5100: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
5110: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
5120: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5130: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5140: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
5150: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
5160: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
5170: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
5180: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5190: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
51a0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
51b0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
51c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
51d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
51e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
51f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
5200: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
5210: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
5220: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
5230: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
5240: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
5250: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
5260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5270: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5280: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
5290: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
52a0: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
52b0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
52c0: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
52d0: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
52e0: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
52f0: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
5300: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
5310: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
5320: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
5330: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
5340: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
5350: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
5360: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
5370: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
5380: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
5390: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
53a0: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
53b0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
53c0: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
53d0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
53e0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
53f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
5400: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
5410: 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20  nested==0 .     
5420: 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d       && (pParse-
5430: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
5440: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
5450: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
5460: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
5470: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
5480: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
5490: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
54a0: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
54b0: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
54c0: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
54d0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
54e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
54f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5500: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5510: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
5520: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
5530: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
5540: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
5550: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
5560: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
5570: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
5580: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
5590: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
55a0: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
55b0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
55c0: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
55d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
55e0: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
55f0: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
5600: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
5610: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
5620: 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  me. The isTemp.*
5630: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
5640: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
5650: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
5660: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
5670: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
5680: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
5690: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
56a0: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
56b0: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
56c0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
56d0: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
56e0: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
56f0: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
5700: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
5710: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
5720: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
5730: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
5740: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
5750: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
5760: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
5770: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5780: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
5790: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
57a0: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
57b0: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
57c0: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
57d0: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
57e0: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
57f0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
5800: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
5810: 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  he sqlite3EndTab
5820: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
5830: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
5840: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
5850: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
5860: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
5870: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
5880: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
5890: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
58a0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
58b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
58c0: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
58d0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
58e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
58f0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
5900: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
5910: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65  cond part of the
5920: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5930: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
5940: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
5950: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
5960: 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65   is a TEMP table
5970: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
5980: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
5990: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57  f this is a VIEW
59a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74   */.  int isVirt
59b0: 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69  ual,   /* True i
59c0: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54  f this is a VIRT
59d0: 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  UAL table */.  i
59e0: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
59f0: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
5a00: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
5a10: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
5a20: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63  ble *pTable;.  c
5a30: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
5a40: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
5a50: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
5a60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5a70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
5a80: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
5a90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
5aa0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
5ab0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
5ac0: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
5ad0: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
5ae0: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
5af0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
5b00: 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eate */..  /* Th
5b10: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5b20: 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69  name to create i
5b30: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
5b40: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
5b50: 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20  ens.  ** pName1 
5b60: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5b70: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5b80: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5b90: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5ba0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
5bb0: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5bc0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ...);.  ** .  **
5bd0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5be0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5bf0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5c00: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
5c10: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62   if.  ** the tab
5c20: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
5c30: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5c40: 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  i.e.:.  **.  ** 
5c50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
5c60: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  (...);.  **.  **
5c70: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5c80: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
5c90: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20   pName2 is "".. 
5ca0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
5cb0: 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65  l below sets the
5cc0: 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74   pName pointer t
5cd0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5ce0: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5cf0: 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61    ** pName2) tha
5d00: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
5d10: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
5d20: 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ame. The variabl
5d30: 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65  e iDb is.  ** se
5d40: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
5d50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
5d60: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72  hat the table or
5d70: 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20   view is to be. 
5d80: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a   ** created in..
5d90: 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
5da0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
5db0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
5dc0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
5dd0: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
5de0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d  eturn;.  if( !OM
5df0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5e00: 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a  emp && iDb>1 ){.
5e10: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
5e20: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
5e30: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
5e40: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a  t be qualified *
5e50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
5e60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5e70: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
5e80: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
5e90: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
5ea0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
5eb0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5ec0: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
5ed0: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
5ee0: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
5ef0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
5f00: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
5f10: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
5f20: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
5f30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
5f40: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
5f50: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
5f60: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
5f70: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
5f80: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
5f90: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
5fa0: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
5fb0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
5fc0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5fd0: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
5fe0: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
5ff0: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
6000: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
6010: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
6020: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
6030: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
6040: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
6050: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
6060: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
6070: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
6080: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6090: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
60a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
60b0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
60c0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
60d0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
60e0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
60f0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
6100: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6110: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
6120: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
6130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6140: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
6150: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6160: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
6170: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6180: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6190: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
61a0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
61b0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
61c0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
61d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
61e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
61f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
6200: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
6210: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
6220: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6230: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
6240: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
6250: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
6260: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
6270: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
6280: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
6290: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
62a0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65  name in the same
62b0: 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75   database.  Issu
62c0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
62d0: 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f  ge if.  ** it do
62e0: 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  es. The exceptio
62f0: 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74  n is if the stat
6300: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73  ement being pars
6310: 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20  ed was passed.  
6320: 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ** to an sqlite3
6330: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
6340: 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61  call. In that ca
6350: 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  se only the colu
6360: 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e  mn names.  ** an
6370: 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20  d types will be 
6380: 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  used, so there i
6390: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73  s no need to tes
63a0: 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a  t for namespace.
63b0: 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e    ** collisions.
63c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f  .  */.  if( !IN_
63d0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
63e0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
63f0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
6400: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
6410: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6420: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6430: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
6440: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
6450: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d  e(db, zName, db-
6460: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
6470: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
6480: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e   ){.      if( !n
6490: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  oErr ){.        
64a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
64b0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
64c0: 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  T already exists
64d0: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", pName);.     
64e0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65   }.      goto be
64f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6500: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
6510: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
6520: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
6530: 20 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21   && (iDb==0 || !
6540: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29  db->init.busy) )
6550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
6560: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6570: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
6580: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
6590: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
65a0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
65b0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
65c0: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
65d0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65e0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
65f0: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
6600: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
6610: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6620: 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73  d = 1;.    pPars
6630: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
6640: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
6650: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
6660: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6670: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
6680: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
6690: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
66a0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
66b0: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
66c0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
66d0: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  a;.  pTable->nRe
66e0: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d  f = 1;.  pTable-
66f0: 3e 64 62 4d 65 6d 20 3d 20 30 3b 0a 20 20 61 73  >dbMem = 0;.  as
6700: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
6710: 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  ewTable==0 );.  
6720: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6730: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
6740: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
6750: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
6760: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
6770: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
6780: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
6790: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
67a0: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
67b0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
67c0: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
67d0: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
67e0: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
67f0: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
6800: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6810: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
6820: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
6830: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
6840: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6850: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
6860: 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  {.    pTable->pS
6870: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
6880: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
6890: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
68a0: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
68b0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
68c0: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
68d0: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
68e0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
68f0: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
6900: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
6910: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
6920: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
6930: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
6940: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
6950: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
6960: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
6970: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
6980: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
6990: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
69a0: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
69b0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
69c0: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
69d0: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
69e0: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
69f0: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
6a00: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
6a10: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
6a20: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
6a30: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
6a40: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
6a50: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
6a60: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
6a70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
6a80: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
6a90: 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69     int j1;.    i
6aa0: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
6ab0: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
6ac0: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c  2, reg3;.    sql
6ad0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6ae0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
6af0: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
6b00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6b10: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
6b20: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
6b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b40: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
6b50: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  egin);.    }.#en
6b60: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
6b70: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61  he file format a
6b80: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74  nd encoding in t
6b90: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65  he database have
6ba0: 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a   not been set, .
6bb0: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20      ** set them 
6bc0: 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  now..    */.    
6bd0: 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg1 = pParse->r
6be0: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
6bf0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6c00: 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g2 = pParse->reg
6c10: 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Root = ++pParse-
6c20: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20  >nMem;.    reg3 
6c30: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6c40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6c50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65  eAddOp3(v, OP_Re
6c60: 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72  adCookie, iDb, r
6c70: 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  eg3, BTREE_FILE_
6c80: 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c  FORMAT);.    sql
6c90: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6ca0: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a  e(v, iDb);.    j
6cb0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
6cc0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
6cd0: 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46  reg3);.    fileF
6ce0: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
6cf0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
6d00: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
6d30: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
6d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d50: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6d60: 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72  r, fileFormat, r
6d70: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6d80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6d90: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
6da0: 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  , BTREE_FILE_FOR
6db0: 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  MAT, reg3);.    
6dc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6dd0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6de0: 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b   ENC(db), reg3);
6df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6e00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
6e10: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
6e20: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
6e30: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
6e40: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
6e50: 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a  (v, j1);..    /*
6e60: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
6e70: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
6e80: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
6e90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
6ea0: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
6eb0: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
6ec0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
6ed0: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
6ee0: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
6ef0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
6f00: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
6f10: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
6f20: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6f30: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
6f40: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
6f50: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
6f60: 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
6f70: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  r pParse->regRow
6f80: 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  id..    ** The r
6f90: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
6fa0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6fb0: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20   is left in reg 
6fc0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
6fd0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6fe0: 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  d and root page 
6ff0: 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72  number values ar
7000: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
7010: 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  code that.    **
7020: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
7030: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
7040: 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69      */.#if !defi
7050: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7060: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
7070: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
7080: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
7090: 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73  if( isView || is
70a0: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
70b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
70c0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
70d0: 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  , 0, reg2);.    
70e0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
70f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7100: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7110: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44  _CreateTable, iD
7120: 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a  b, reg2);.    }.
7130: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
7140: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73  asterTable(pPars
7150: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
7160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7170: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
7180: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
7190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
71a0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
71b0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
71c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
71d0: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33  _Insert, 0, reg3
71e0: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
71f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7200: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7210: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
7220: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
7230: 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Close);.  }..  /
7240: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
7250: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
7260: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
7270: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
7280: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
7290: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
72a0: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
72b0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
72c0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
72d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
72e0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
72f0: 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  are two strings 
7300: 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73  in a case-insens
7310: 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a  itive manner..**
7320: 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20   It is slightly 
7330: 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c  faster than call
7340: 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43  ing sqlite3StrIC
7350: 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62  mp() directly, b
7360: 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c  ut.** produces l
7370: 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  arger code..**.*
7380: 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20  * WARNING: This 
7390: 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d  macro is not com
73a0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
73b0: 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79   strcmp() family
73c0: 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  . It.** returns 
73d0: 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20  true if the two 
73e0: 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61  strings are equa
73f0: 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c  l, otherwise fal
7400: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  se..*/.#define S
7410: 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a  TRICMP(x, y) (\.
7420: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7430: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
7440: 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c  har *)(x)]==   \
7450: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
7460: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
7470: 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20  char *)(y)]     
7480: 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  \.&& sqlite3StrI
7490: 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29  Cmp((x)+1,(y)+1)
74a0: 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ==0 )../*.** Add
74b0: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
74c0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
74d0: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
74e0: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
74f0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
7500: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
7510: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
7520: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
7530: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
7540: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
7550: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
7560: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
7570: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
7580: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
7590: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
75a0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
75b0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
75c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
75d0: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
75e0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
75f0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
7600: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
7610: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
7620: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
7630: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7640: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
7650: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7660: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53   ) return;.#if S
7670: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
7680: 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31  .  if( p->nCol+1
7690: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
76a0: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
76b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
76c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
76d0: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
76e0: 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  s on %s", p->zNa
76f0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
7700: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20  .  }.#endif.  z 
7710: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
7720: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
7730: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
7740: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7750: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
7760: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49  +){.    if( STRI
7770: 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  CMP(z, p->aCol[i
7780: 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ].zName) ){.    
7790: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
77a0: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
77b0: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
77c0: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
77d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
77e0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
77f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
7800: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
7810: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
7820: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
7830: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
7840: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
7850: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
7860: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
7870: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
7880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
7890: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
78a0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
78b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
78c0: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
78d0: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
78e0: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
78f0: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
7900: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
7910: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
7920: 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20   = z;. .  /* If 
7930: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
7940: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
7950: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
7960: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
7970: 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68  ** 'NONE'. If th
7980: 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70  ere is a type sp
7990: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71  ecified, then sq
79a0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
79b0: 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  pe() will.  ** b
79c0: 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f  e called next to
79d0: 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   set pCol->affin
79e0: 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ity correctly.. 
79f0: 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   */.  pCol->affi
7a00: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
7a10: 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f  F_NONE;.  p->nCo
7a20: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
7a30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
7a40: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
7a50: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
7a60: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
7a70: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
7a80: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7a90: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
7aa0: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
7ab0: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
7ac0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
7ad0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
7ae0: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
7af0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
7b00: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
7b10: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
7b20: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
7b30: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
7b40: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
7b50: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20    Table *p;.  p 
7b60: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7b70: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
7b80: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
7b90: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
7ba0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
7bb0: 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  1].notNull = (u8
7bc0: 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  )onError;.}../*.
7bd0: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
7be0: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
7bf0: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
7c00: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
7c10: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
7c20: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
7c30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7c40: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
7c50: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
7c60: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
7c70: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
7c80: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
7c90: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
7ca0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7cb0: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
7cc0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7cd0: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
7ce0: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
7cf0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
7d00: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
7d10: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
7d20: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
7d30: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
7d40: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
7d50: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
7d60: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
7d70: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
7d80: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
7d90: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
7da0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
7db0: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
7de0: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
7df0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7e00: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
7e10: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7e20: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
7e30: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7e40: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
7e50: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
7e60: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7e70: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
7e80: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
7e90: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
7ea0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7eb0: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
7ec0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7ed0: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
7ee0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7ef0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
7f00: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
7f10: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
7f20: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
7f30: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
7f40: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
7f50: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
7f60: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
7f70: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
7f80: 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32 20 68 20   *zIn){.  u32 h 
7f90: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
7fa0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
7fb0: 45 52 49 43 3b 0a 0a 20 20 69 66 28 20 7a 49 6e  ERIC;..  if( zIn
7fc0: 20 29 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d   ) while( zIn[0]
7fd0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c   ){.    h = (h<<
7fe0: 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65  8) + sqlite3Uppe
7ff0: 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26  rToLower[(*zIn)&
8000: 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  0xff];.    zIn++
8010: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
8020: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
8030: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
8040: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
8050: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
8060: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8070: 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73  _TEXT; .    }els
8080: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
8090: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
80a0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
80b0: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
80c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
80d0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
80e0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
80f0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
8100: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
8110: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
8120: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
8130: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8140: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8150: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
8160: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8170: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
8180: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
8190: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
81a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
81b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
81c0: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
81d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
81e0: 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53  _NONE;.#ifndef S
81f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
8200: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
8210: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
8220: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
8230: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
8240: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
8250: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
8260: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
8270: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
8280: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
8290: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
82a0: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
82b0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
82c0: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
82d0: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
82e0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
82f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8300: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
8310: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
8320: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8330: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
8340: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
8350: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
8360: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
8370: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8380: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8390: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
83a0: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
83b0: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
83c0: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
83d0: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
83e0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
83f0: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
8400: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8410: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
8420: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
8430: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
8440: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8450: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8460: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8470: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8480: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8490: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
84a0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46  atement.  The pF
84b0: 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  irst token is th
84c0: 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e  e first.** token
84d0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
84e0: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   of tokens that 
84f0: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70  describe the typ
8500: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
8510: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
8520: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8530: 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20     pLast is the 
8540: 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e  last token.** in
8550: 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20   the sequence.  
8560: 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  Use this informa
8570: 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63  tion to construc
8580: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  t a string.** th
8590: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
85a0: 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  typename of the 
85b0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65  column and store
85c0: 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20   that string.** 
85d0: 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f  in zType..*/ .vo
85e0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
85f0: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
8600: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
8610: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
8620: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8630: 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  ;..  p = pParse-
8640: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
8650: 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
8660: 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74  p->nCol<1) ) ret
8670: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
8680: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8690: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  ];.  assert( pCo
86a0: 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20  l->zType==0 );. 
86b0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
86c0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
86d0: 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
86e0: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
86f0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8700: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
8710: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 7d 0a 0a  Col->zType);.}..
8720: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
8730: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
8740: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
8750: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8760: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
8770: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
8780: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8790: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
87a0: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
87b0: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
87c0: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
87d0: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
87e0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
87f0: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
8800: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8810: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
8820: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
8830: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
8840: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
8850: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8860: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
8870: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
8880: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
8890: 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61  , ExprSpan *pSpa
88a0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
88b0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
88c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
88d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20  pParse->db;.  p 
88e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
88f0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20  ble;.  if( p!=0 
8900: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
8910: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
8920: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
8930: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
8940: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53  antOrFunction(pS
8950: 70 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20  pan->pExpr) ){. 
8960: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8970: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
8980: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
8990: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
89a0: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
89b0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
89c0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
89d0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
89e0: 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64  of pExpr is used
89f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
8a00: 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78  original, as pEx
8a10: 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  pr contains.    
8a20: 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74    ** tokens that
8a30: 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69   point to volati
8a40: 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27  le memory. The '
8a50: 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70  span' of the exp
8a60: 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
8a70: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
8a80: 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66  pragma table_inf
8a90: 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  o..      */.    
8aa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8ab0: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
8ac0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
8ad0: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
8ae0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70  3ExprDup(db, pSp
8af0: 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44  an->pExpr, EXPRD
8b00: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
8b10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8b20: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  db, pCol->zDflt)
8b30: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44  ;.      pCol->zD
8b40: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53  flt = sqlite3DbS
8b50: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
8b60: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
8b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61        (int)(pSpa
8ba0: 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d  n->zEnd - pSpan-
8bb0: 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d  >zStart));.    }
8bc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
8bd0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70  prDelete(db, pSp
8be0: 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  an->pExpr);.}../
8bf0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
8c00: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
8c10: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
8c20: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
8c30: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
8c40: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
8c50: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
8c60: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
8c70: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
8c80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8c90: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
8ca0: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
8cb0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
8cc0: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
8cd0: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
8ce0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
8cf0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
8d00: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
8d10: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
8d20: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
8d30: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
8d40: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
8d50: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
8d60: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
8d70: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
8d80: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
8d90: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
8da0: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
8db0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
8dc0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
8dd0: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
8de0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
8df0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
8e00: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8e10: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
8e20: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
8e30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8e40: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
8e50: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
8e60: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
8e70: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
8e80: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
8e90: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
8ea0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
8eb0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
8ec0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
8ed0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
8ee0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
8ef0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
8f00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8f10: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
8f20: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
8f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8f40: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
8f50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8f60: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
8f70: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
8f80: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
8f90: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
8fa0: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
8fb0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
8fc0: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
8fd0: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
8fe0: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
8ff0: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
9000: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
9010: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
9020: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
9030: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
9040: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
9050: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
9060: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
9070: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9080: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
9090: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
90a0: 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  1, i;.  if( pTab
90b0: 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
90c0: 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72  E_VTAB ) goto pr
90d0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
90e0: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
90f0: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
9100: 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73  maryKey ){.    s
9110: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9120: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
9130: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
9140: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
9150: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
9160: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
9170: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
9180: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
9190: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
91a0: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20  HasPrimaryKey;. 
91b0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
91c0: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
91d0: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->nCol - 1;.    
91e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
91f0: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
9200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
9210: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
9220: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9230: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
9240: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
9250: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
9260: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9270: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
9280: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
9290: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
92a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
92b0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
92c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
92d0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
92e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
92f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
9300: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  rimKey = 1;.    
9310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9320: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
9330: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
9340: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
9350: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
9360: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
9370: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
9380: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
9390: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
93a0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
93b0: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
93c0: 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74  .        && sort
93d0: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
93e0: 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62  _ASC ){.    pTab
93f0: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
9400: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
9410: 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  f = (u8)onError;
9420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74  .    assert( aut
9430: 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49  oInc==0 || autoI
9440: 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  nc==1 );.    pTa
9450: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61  b->tabFlags |= a
9460: 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e  utoInc*TF_Autoin
9470: 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65  crement;.  }else
9480: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
9490: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
94a0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
94b0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
94c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
94d0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
94e0: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
94f0: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
9500: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9510: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
9520: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
9530: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
9540: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
9550: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
9560: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b  , sortOrder, 0);
9570: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
9580: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
9590: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
95a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
95b0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
95c0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
95d0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
95e0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
95f0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
9600: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9610: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
9620: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
9630: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
9640: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9650: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9660: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9670: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
9680: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
9690: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
96a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
96b0: 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
96c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
96d0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
96e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
96f0: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  le;.  if( pTab &
9700: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
9710: 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  AB ){.    pTab->
9720: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
9730: 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62  ExprAnd(db, pTab
9740: 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b  ->pCheck, pCheck
9750: 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Expr);.  }else.#
9760: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
9770: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9780: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
9790: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
97a0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
97b0: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
97c0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
97d0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
97e0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
97f0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
9800: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
9810: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
9820: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9830: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
9840: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
9850: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
9860: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
9870: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
9880: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9890: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
98a0: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
98b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
98c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
98d0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
98e0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
98f0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
9900: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9910: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
9920: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
9930: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
9940: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9950: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
9960: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9970: 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  dx;.    p->aCol[
9980: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
9990: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
99a0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
99b0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
99c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
99d0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
99e0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
99f0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
9a00: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
9a10: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
9a20: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
9a30: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
9a40: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
9a50: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
9a60: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9a70: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9a80: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9a90: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9aa0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9ab0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9ac0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9ad0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
9ae0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
9af0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
9b00: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
9b10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
9b20: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
9b30: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
9b40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9b50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9b60: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9b70: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9b80: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9b90: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9ba0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9bb0: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
9bc0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
9bd0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
9be0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
9bf0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
9c00: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
9c10: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
9c20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
9c30: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
9c40: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9c50: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
9c60: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
9c70: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
9c80: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
9c90: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
9ca0: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
9cb0: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
9cc0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
9cd0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
9ce0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
9cf0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
9d00: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
9d10: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
9d20: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9d30: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
9d40: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
9d50: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
9d60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
9d70: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
9d80: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
9d90: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
9da0: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
9db0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9dc0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
9dd0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
9de0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
9df0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
9e00: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
9e10: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
9e20: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
9e30: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
9e40: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
9e50: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9e60: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
9e70: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
9e80: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
9e90: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
9ea0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
9eb0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
9ec0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9ed0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
9ee0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9ef0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
9f00: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
9f10: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
9f20: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
9f30: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
9f40: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
9f50: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
9f60: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
9f70: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
9f80: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
9f90: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
9fa0: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
9fb0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
9fc0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
9fd0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
9fe0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
9ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a000: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a010: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
a020: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c  n sequence: %s",
a030: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
a040: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
a050: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
a060: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
a070: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
a080: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
a090: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
a0a0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
a0b0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a0c0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
a0d0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
a0e0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
a0f0: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
a100: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
a110: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
a120: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
a130: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
a140: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
a150: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
a160: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
a170: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
a180: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
a190: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
a1a0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
a1b0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
a1c0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
a1d0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
a1e0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
a1f0: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
a200: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
a210: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
a220: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
a230: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
a240: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
a250: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
a260: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
a270: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
a280: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
a290: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
a2a0: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
a2b0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
a2c0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
a2d0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
a2e0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
a2f0: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
a300: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
a310: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
a320: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
a330: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
a340: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a350: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
a360: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
a370: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a380: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a390: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
a3a0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a3b0: 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65  >pVdbe;.  sqlite
a3c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a3d0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
a3e0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a3f0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
a400: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
a410: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a420: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
a430: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
a440: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
a450: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a460: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a480: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a490: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a4a0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a4b0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a4c0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a4d0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a4e0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a4f0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a500: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a510: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a520: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a530: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a540: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a550: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a560: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a570: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a580: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a590: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a5a0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a5b0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a5c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a5d0: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
a5e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
a5f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
a600: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
a610: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a620: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
a630: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
a640: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
a650: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
a660: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
a670: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
a680: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
a690: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
a6a0: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
a6b0: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
a6c0: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
a6d0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
a6e0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
a6f0: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
a700: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
a710: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
a720: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
a730: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
a740: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
a750: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
a760: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
a770: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
a780: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
a790: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
a7a0: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
a7b0: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
a7c0: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
a7d0: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
a7e0: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
a7f0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
a800: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
a810: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
a820: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
a830: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
a840: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
a850: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
a860: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
a870: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
a880: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
a890: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
a8a0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
a8b0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
a8c0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
a8d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
a8e0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
a8f0: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
a900: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
a910: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
a920: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
a930: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
a940: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
a950: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
a960: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
a970: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
a980: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
a990: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
a9a0: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20  igit(zIdent[0]) 
a9b0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
a9c0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
a9d0: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21  !=TK_ID;.  if( !
a9e0: 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20  needQuote ){.   
a9f0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64   needQuote = zId
aa00: 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69  ent[j];.  }..  i
aa10: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
aa20: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
aa30: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
aa40: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
aa50: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
aa60: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
aa70: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
aa80: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
aa90: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
aaa0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
aab0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
aac0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
aad0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
aae0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
aaf0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
ab00: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
ab10: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
ab20: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
ab30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
ab40: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
ab50: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
ab60: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
ab70: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
ab80: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
ab90: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
aba0: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
abb0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
abc0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
abd0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
abe0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
abf0: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
ac00: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
ac10: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
ac20: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
ac30: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
ac40: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
ac50: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
ac60: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
ac70: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
ac80: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
ac90: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
aca0: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
acb0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
acc0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
acd0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
ace0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
acf0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
ad00: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
ad10: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
ad20: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
ad30: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
ad40: 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a  te3Malloc( n );.
ad50: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
ad60: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
ad70: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
ad80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ad90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ada0: 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41  (n, zStmt, "CREA
adb0: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
adc0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
add0: 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  30(zStmt);.  ide
ade0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
adf0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
ae00: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
ae10: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
ae20: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
ae30: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
ae40: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
ae50: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
ae60: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20  azType[] = {.   
ae70: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
ae80: 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20  FF_TEXT    */ " 
ae90: 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f  TEXT",.        /
aea0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
aeb0: 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  E    */ "",.    
aec0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
aed0: 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e  F_NUMERIC */ " N
aee0: 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  UM",.        /* 
aef0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
af00: 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20  ER */ " INT",.  
af10: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
af20: 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22  AFF_REAL    */ "
af30: 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20   REAL".    };.  
af40: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
af50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
af60: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ;..    sqlite3_s
af70: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
af80: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
af90: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
afa0: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
afb0: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
afc0: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
afd0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
afe0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
aff0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
b000: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
b010: 46 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b 0a 20  F_TEXT >= 0 );. 
b020: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b030: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
b040: 5f 41 46 46 5f 54 45 58 54 20 3c 20 73 69 7a 65  _AFF_TEXT < size
b050: 6f 66 28 61 7a 54 79 70 65 29 2f 73 69 7a 65 6f  of(azType)/sizeo
b060: 66 28 61 7a 54 79 70 65 5b 30 5d 29 20 29 3b 0a  f(azType[0]) );.
b070: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
b080: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
b090: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
b0a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b0b0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b0c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
b0d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b0e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b0f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
b100: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
b110: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
b120: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
b130: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
b140: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
b150: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
b160: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
b170: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
b180: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
b190: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  y - SQLITE_AFF_T
b1a0: 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  EXT];.    len = 
b1b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b1c0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
b1d0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
b1e0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
b1f0: 4f 4e 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ONE .           
b200: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
b210: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
b220: 69 74 79 54 79 70 65 28 7a 54 79 70 65 29 20 29  ityType(zType) )
b230: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53  ;.    memcpy(&zS
b240: 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c  tmt[k], zType, l
b250: 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65  en);.    k += le
b260: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b  n;.    assert( k
b270: 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  <=n );.  }.  sql
b280: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
b290: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
b2a0: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
b2b0: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
b2c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b2d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
b2e0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
b2f0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
b300: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
b310: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
b320: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
b330: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
b340: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
b350: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
b360: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
b370: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
b380: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
b390: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
b3a0: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
b3b0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
b3c0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
b3d0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
b3e0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
b3f0: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
b400: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
b410: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
b420: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
b430: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
b440: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
b450: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b460: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
b470: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
b480: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
b490: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
b4a0: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
b4b0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
b4c0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
b4d0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
b4e0: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
b4f0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
b500: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
b510: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
b520: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
b530: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
b540: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
b550: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
b560: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
b570: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
b580: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
b590: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
b5a0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
b5b0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
b5c0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
b5d0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
b5e0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
b5f0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
b600: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
b610: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
b620: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
b630: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
b640: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
b650: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
b660: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b670: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
b680: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
b690: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
b6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b6b0: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
b6c0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
b6d0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
b6e0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b6f0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20     /* The final 
b700: 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ')' token in the
b710: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
b720: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
b730: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
b740: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
b750: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
b760: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
b770: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
b780: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b790: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
b7a0: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
b7b0: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62  Select==0) || db
b7c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b7d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
b7e0: 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  }.  p = pParse->
b7f0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
b800: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
b810: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
b820: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
b830: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62 20  elect );..  iDb 
b840: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
b850: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
b860: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
b870: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
b880: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
b890: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
b8a0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
b8b0: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
b8c0: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
b8d0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73  ){.    SrcList s
b8e0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
b8f0: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53         /* Fake S
b900: 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73  rcList for pPars
b910: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
b920: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
b930: 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  sNC;            
b940: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
b950: 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ext for pParse->
b960: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20  pNewTable */..  
b970: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
b980: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
b990: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63      memset(&sSrc
b9a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63  , 0, sizeof(sSrc
b9b0: 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72  ));.    sSrc.nSr
b9c0: 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e  c = 1;.    sSrc.
b9d0: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e  a[0].zName = p->
b9e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e  zName;.    sSrc.
b9f0: 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20  a[0].pTab = p;. 
ba00: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75     sSrc.a[0].iCu
ba10: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  rsor = -1;.    s
ba20: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
ba30: 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
ba40: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
ba50: 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20    sNC.isCheck = 
ba60: 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
ba70: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
ba80: 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65  es(&sNC, p->pChe
ba90: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ck) ){.      ret
baa0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
bab0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
bac0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  d(SQLITE_OMIT_CH
bad0: 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ECK) */..  /* If
bae0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
baf0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
bb00: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
bb10: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
bb20: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
bb30: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
bb40: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
bb50: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
bb60: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
bb70: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
bb80: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
bb90: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
bba0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
bbb0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
bbc0: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
bbd0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
bbe0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
bbf0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
bc00: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
bc10: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
bc20: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
bc30: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
bc40: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
bc50: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
bc60: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
bc70: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
bc80: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
bc90: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
bca0: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
bcb0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
bcc0: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
bcd0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
bce0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
bcf0: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
bd00: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
bd10: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
bd20: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
bd30: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
bd40: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
bd50: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
bd60: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
bd70: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
bd80: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
bd90: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
bda0: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
bdb0: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
bdc0: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
bdd0: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
bde0: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
bdf0: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
be00: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
be10: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
be20: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
be30: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
be40: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
be50: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
be60: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
be70: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
be80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
be90: 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
bea0: 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61  * .    ** Initia
beb0: 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74  lize zType for t
bec0: 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74  he new view or t
bed0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
bee0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
bef0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
bf00: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
bf10: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
bf20: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
bf30: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
bf40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bf50: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
bf60: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
bf70: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
bf80: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
bf90: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
bfa0: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
bfb0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
bfc0: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
bfd0: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
bfe0: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
bff0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
c000: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
c010: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
c020: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
c030: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
c040: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
c050: 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  le is in registe
c060: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
c070: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
c080: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
c090: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
c0a0: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
c0b0: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
c0c0: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
c0d0: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
c0e0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
c0f0: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
c100: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
c110: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
c120: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
c130: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
c140: 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
c150: 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
c160: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
c170: 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
c180: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
c190: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
c1a0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
c1b0: 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
c1c0: 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
c1d0: 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
c1e0: 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
c1f0: 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
c200: 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
c210: 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
c220: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c230: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c240: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
c250: 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  t;.      Table *
c260: 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20  pSelTab;..      
c270: 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
c280: 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
c290: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c2a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
c2b0: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
c2c0: 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
c2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c2e0: 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20  ngeP5(v, 1);.   
c2f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
c300: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
c310: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
c320: 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61 62 6c  (&dest, SRT_Tabl
c330: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 1);.      sql
c340: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c350: 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73  e, pSelect, &des
c360: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c370: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c380: 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20  P_Close, 1);.   
c390: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
c3a0: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
c3b0: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
c3c0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
c3d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
c3e0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
c3f0: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
c400: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
c410: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
c420: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
c430: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
c440: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
c450: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
c460: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
c470: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
c480: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
c490: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
c4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
c4b0: 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62  eteTable(pSelTab
c4c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c4d0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
c4e0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
c4f0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
c500: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c510: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
c520: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
c530: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
c540: 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
c550: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  {.      n = (int
c560: 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72  )(pEnd->z - pPar
c570: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
c580: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74  ) + 1;.      zSt
c590: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
c5a0: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
c5b0: 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
c5c0: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
c5d0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
c5e0: 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
c5f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
c600: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
c610: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
c620: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
c630: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
c640: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
c650: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
c660: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
c670: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
c680: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
c690: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
c6a0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
c6b0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
c6c0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
c6d0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
c6e0: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
c6f0: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
c700: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
c710: 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
c720: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
c730: 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
c740: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
c750: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
c760: 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
c770: 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
c780: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c790: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c7a0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
c7b0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
c7c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
c7d0: 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
c7e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c7f0: 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
c800: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
c810: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
c820: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c830: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
c840: 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
c850: 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
c860: 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
c870: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
c880: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
c890: 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
c8a0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
c8b0: 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
c8c0: 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  if( p->tabFlags 
c8d0: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
c8e0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nt ){.      Db *
c8f0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
c900: 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Db];.      if( p
c910: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
c920: 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
c930: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
c940: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
c950: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
c960: 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
c970: 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
c980: 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
c990: 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
c9a0: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
c9b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
c9c0: 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
c9d0: 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
c9e0: 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
c9f0: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
ca00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca10: 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65  dOp4(v, OP_Parse
ca20: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
ca30: 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0,.        sqlit
ca40: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74  e3MPrintf(db, "t
ca50: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d  bl_name='%q'",p-
ca60: 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41  >zName), P4_DYNA
ca70: 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  MIC);.  }...  /*
ca80: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
ca90: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
caa0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
cab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
cac0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
cad0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
cae0: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
caf0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
cb00: 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20   = p->pSchema;. 
cb10: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
cb20: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
cb30: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
cb40: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
cb70: 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c  len30(p->zName),
cb80: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
cb90: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cba0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
cbb0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
cbc0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
cbd0: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
cbe0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
cbf0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
cc00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
cc10: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
cc20: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
cc30: 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20  b->nTable++;.   
cc40: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
cc50: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
cc60: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
cc70: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
cc80: 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
cc90: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
cca0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ccb0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
ccc0: 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
ccd0: 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
cce0: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
ccf0: 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
cd00: 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
cd10: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
cd20: 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
cd30: 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
cd40: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
cd50: 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
cd60: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
cd70: 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
cd80: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
cd90: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
cda0: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
cdb0: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
cdc0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
cdd0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
cde0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
cdf0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
ce00: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
ce10: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
ce20: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
ce30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
ce40: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
ce50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
ce60: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
ce70: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ce80: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
ce90: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
cea0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
ceb0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
cec0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
ced0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
cee0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
cef0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
cf00: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
cf10: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
cf20: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
cf30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
cf40: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
cf50: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
cf60: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
cf70: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
cf80: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
cf90: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
cfa0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p,        /* TRU
cfb0: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
cfc0: 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  Y view */.  int 
cfd0: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f  noErr          /
cfe0: 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72  * Suppress error
cff0: 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45   messages if VIE
d000: 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  W already exists
d010: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
d020: 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
d030: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  nst char *z;.  T
d040: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
d050: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
d060: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  en *pName;.  int
d070: 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
d080: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d090: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
d0a0: 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
d0b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d0c0: 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
d0d0: 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
d0e0: 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
d0f0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
d100: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d110: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
d120: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
d130: 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
d140: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
d150: 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
d160: 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
d170: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
d180: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
d190: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d1a0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d1b0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
d1c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
d1d0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
d1e0: 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 53 74   /* If sqlite3St
d1f0: 61 72 74 54 61 62 6c 65 20 72 65 74 75 72 6e 20  artTable return 
d200: 6e 6f 6e 2d 4e 55 4c 4c 20 74 68 65 6e 0a 20 20  non-NULL then.  
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
d230: 65 72 65 20 63 6f 75 6c 64 20 6e 6f 74 20 68 61  ere could not ha
d240: 76 65 20 62 65 65 6e 20 61 6e 20 65 72 72 6f 72  ve been an error
d250: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 77 6f   */.  sqlite3Two
d260: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
d270: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
d280: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
d290: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
d2a0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
d2b0: 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71  chema);.  if( sq
d2c0: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
d2d0: 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
d2e0: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
d2f0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
d300: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
d310: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
d320: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d330: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
d340: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
d350: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
d360: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
d370: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
d380: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
d390: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
d3a0: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
d3b0: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
d3c0: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
d3d0: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
d3e0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
d3f0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
d400: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
d410: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
d420: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
d430: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
d440: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
d450: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
d460: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
d470: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
d480: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
d490: 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
d4a0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
d4b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d4c0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
d4d0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
d4e0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d4f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
d500: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
d510: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
d520: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
d530: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
d540: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
d550: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
d560: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
d570: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
d580: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
d590: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
d5a0: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
d5b0: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
d5c0: 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d  ALWAYS(sEnd.z[0]
d5d0: 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30  !=0) && sEnd.z[0
d5e0: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
d5f0: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
d600: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
d610: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
d620: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
d630: 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  );.  z = pBegin-
d640: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57  >z;.  while( ALW
d650: 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69  AYS(n>0) && sqli
d660: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31  te3Isspace(z[n-1
d670: 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  ]) ){ n--; }.  s
d680: 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
d690: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
d6a0: 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33    /* Use sqlite3
d6b0: 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
d6c0: 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
d6d0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
d6e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
d6f0: 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
d700: 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b  e, 0, &sEnd, 0);
d710: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
d720: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d730: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20  IT_VIEW */..#if 
d740: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d750: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
d760: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d770: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
d780: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
d790: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
d7a0: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
d7b0: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
d7c0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
d7d0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
d7e0: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
d7f0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
d800: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
d810: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
d820: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
d830: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
d840: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
d850: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
d860: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
d870: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
d880: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
d890: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
d8a0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
d8b0: 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
d8c0: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
d8d0: 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
d8e0: 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
d8f0: 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
d900: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
d910: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
d920: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
d930: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
d940: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
d950: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
d960: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
d970: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
d980: 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
d990: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
d9a0: 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20  rs assigned */. 
d9b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d9c0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
d9d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d9e0: 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72  on for malloc er
d9f0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  rors */.  int (*
da00: 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74  xAuth)(void*,int
da10: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
da20: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
da30: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
da40: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  );..  assert( pT
da50: 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
da60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
da70: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
da80: 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
da90: 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
daa0: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
dab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dac0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
dad0: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
dae0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
daf0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
db00: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
db10: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
db20: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
db30: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
db40: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
db50: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
db60: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
db70: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
db80: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
db90: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
dba0: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
dbb0: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
dbc0: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
dbd0: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
dbe0: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
dbf0: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
dc00: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
dc10: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
dc20: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
dc30: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
dc40: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
dc50: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
dc60: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
dc70: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
dc80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
dc90: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
dca0: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
dcb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
dcc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
dcd0: 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
dce0: 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
dcf0: 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
dd00: 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
dd10: 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
dd20: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
dd30: 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
dd40: 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
dd50: 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
dd60: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
dd70: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
dd80: 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
dd90: 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
dda0: 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
ddb0: 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
ddc0: 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
ddd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
dde0: 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
ddf0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
de00: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
de10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
de20: 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
de30: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
de40: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
de50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
de60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
de70: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
de80: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
de90: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
dea0: 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
deb0: 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
dec0: 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
ded0: 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
dee0: 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
def0: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
df00: 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
df10: 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
df20: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
df30: 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
df40: 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
df50: 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
df60: 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
df70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
df80: 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
df90: 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
dfa0: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
dfb0: 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
dfc0: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
dfd0: 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
dfe0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
dff0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
e000: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
e010: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e020: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
e030: 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
e040: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
e050: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
e060: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  t, 0);.  if( pSe
e070: 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62  l ){.    u8 enab
e080: 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62  leLookaside = db
e090: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
e0a0: 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50  bled;.    n = pP
e0b0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
e0c0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
e0d0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
e0e0: 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
e0f0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
e100: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e  l = -1;.    db->
e110: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
e120: 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ed = 0;.#ifndef 
e130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
e140: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41  ORIZATION.    xA
e150: 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
e160: 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
e170: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20   0;.    pSelTab 
e180: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
e190: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
e1a0: 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  e, pSel);.    db
e1b0: 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
e1c0: 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54  .#else.    pSelT
e1d0: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
e1e0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
e1f0: 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e  arse, pSel);.#en
e200: 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  dif.    db->look
e210: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
e220: 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
e230: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  ;.    pParse->nT
e240: 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
e250: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
e260: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
e270: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
e280: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
e290: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
e2a0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
e2b0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
e2c0: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
e2d0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
e2e0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
e2f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
e300: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
e310: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70  SelTab);.      p
e320: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
e330: 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  flags |= DB_Unre
e340: 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65  setViews;.    }e
e350: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
e360: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
e370: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
e380: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
e390: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
e3a0: 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  l);.  } else {. 
e3b0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23     nErr++;.  }.#
e3c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e3d0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
e3e0: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
e3f0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
e400: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
e410: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
e420: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
e430: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
e440: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e450: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
e460: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
e470: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
e480: 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
e490: 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
e4a0: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
e4b0: 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
e4c0: 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
e4d0: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
e4e0: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
e4f0: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
e500: 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
e510: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
e520: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
e530: 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
e540: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
e550: 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
e560: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
e570: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
e580: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
e590: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
e5a0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
e5b0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
e5c0: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
e5d0: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
e5e0: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
e5f0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
e600: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
e610: 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
e620: 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
e630: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e640: 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
e650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e660: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
e670: 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
e680: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
e690: 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
e6a0: 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
e6b0: 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
e6c0: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
e6d0: 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
e6e0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
e6f0: 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
e700: 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
e710: 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
e720: 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
e730: 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
e740: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
e750: 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
e760: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
e770: 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
e780: 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
e790: 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
e7a0: 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
e7b0: 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
e7c0: 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
e7d0: 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
e7e0: 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
e7f0: 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
e800: 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
e810: 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
e820: 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
e830: 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
e840: 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
e850: 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
e860: 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
e870: 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
e880: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
e890: 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
e8a0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
e8b0: 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
e8c0: 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
e8d0: 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
e8e0: 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
e8f0: 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
e900: 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
e910: 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
e920: 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
e930: 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
e940: 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
e950: 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
e960: 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
e970: 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
e980: 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
e990: 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
e9a0: 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
e9b0: 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
e9c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e9d0: 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
e9e0: 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
e9f0: 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  ed(Db *pDb, int 
ea00: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
ea10: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
ea20: 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
ea30: 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70  h;..  pHash = &p
ea40: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
ea50: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
ea60: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
ea70: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
ea80: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
ea90: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
eaa0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
eab0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
eac0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
ead0: 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
eae0: 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
eaf0: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
eb00: 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
eb10: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
eb20: 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
eb30: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
eb40: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
eb50: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
eb60: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
eb70: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
eb80: 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
eb90: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
eba0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
ebb0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
ebc0: 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
ebd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
ebe0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
ebf0: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
ec00: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
ec10: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
ec20: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
ec30: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
ec40: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
ec50: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
ec60: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
ec70: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
ec80: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
ec90: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
eca0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
ecb0: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
ecc0: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
ecd0: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
ece0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
ecf0: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
ed00: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
ed10: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
ed20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
ed30: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
ed40: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
ed50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ed60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
ed70: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
ed80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ed90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
eda0: 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72  dOp3(v, OP_Destr
edb0: 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  oy, iTable, r1, 
edc0: 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  iDb);.  sqlite3M
edd0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
ede0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
edf0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ee00: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
ee10: 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74  stores an in int
ee20: 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73  eger r1. If this
ee30: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
ee40: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
ee50: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
ee60: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
ee70: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
ee80: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
ee90: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
eea0: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
eeb0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eec0: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
eed0: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
eee0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e   **.  ** The "#N
eef0: 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  NN" in the SQL i
ef00: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
ef10: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
ef20: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
ef30: 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74   ** is in regist
ef40: 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61  er NNN.  See gra
ef50: 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63  mmar rules assoc
ef60: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54  iated with the T
ef70: 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20  K_REGISTER.  ** 
ef80: 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69  token for additi
ef90: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
efa0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
efb0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
efc0: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
efd0: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
efe0: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
eff0: 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
f000: 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
f010: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f020: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
f030: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c  LE(iDb), iTable,
f040: 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
f050: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
f060: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f070: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
f080: 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
f090: 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
f0a0: 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
f0b0: 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
f0c0: 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
f0d0: 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
f0e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f0f0: 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
f100: 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
f110: 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
f120: 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
f130: 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
f140: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
f150: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
f160: 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
f170: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
f180: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
f190: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
f1a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f1b0: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
f1c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
f1d0: 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
f1e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f1f0: 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
f200: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62  *pIdx;.  int iDb
f210: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f220: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
f230: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
f240: 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  a);.  destroyRoo
f250: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
f260: 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ab->tnum, iDb);.
f270: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
f280: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f290: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f2a0: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
f2b0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
f2c0: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
f2d0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
f2e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
f2f0: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
f300: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
f310: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f320: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
f330: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
f340: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
f350: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
f360: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
f370: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
f380: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
f390: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
f3a0: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
f3b0: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
f3c0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
f3d0: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
f3e0: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
f3f0: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
f400: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
f410: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
f420: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
f430: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
f440: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
f450: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
f460: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
f470: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
f480: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
f490: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
f4a0: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
f4b0: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
f4c0: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
f4d0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
f4e0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
f4f0: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
f500: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
f510: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
f520: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
f530: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
f540: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
f550: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
f560: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
f570: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
f580: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
f590: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
f5a0: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
f5b0: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
f5c0: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
f5d0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
f5e0: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
f5f0: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
f600: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
f610: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
f620: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
f630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
f640: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f650: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f660: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f670: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
f680: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
f690: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
f6a0: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
f6b0: 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
f6c0: 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
f6d0: 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
f6e0: 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
f6f0: 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
f700: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
f710: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
f720: 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
f730: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
f740: 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
f750: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
f760: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f770: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f780: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f790: 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
f7a0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
f7b0: 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
f7c0: 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
f7d0: 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
f7e0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
f7f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f800: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f810: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
f820: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
f830: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
f840: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
f850: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
f860: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
f870: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
f880: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f890: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
f8a0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
f8b0: 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
f8c0: 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
f8d0: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
f8e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f8f0: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
f900: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f910: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
f920: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f930: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
f940: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
f950: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
f960: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
f970: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
f980: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
f990: 69 73 56 69 65 77 2c 20 0a 20 20 20 20 20 20 20  isView, .       
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d       pName->a[0]
f9c0: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
f9d0: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
f9e0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
f9f0: 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
fa00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fa10: 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73  ErrorClear(pPars
fa20: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  e);.    }.    go
fa30: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fa40: 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
fa50: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
fa60: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
fa70: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
fa80: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
fa90: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
faa0: 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
fab0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
fac0: 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
fad0: 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
fae0: 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
faf0: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
fb00: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
fb10: 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
fb20: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
fb30: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
fb40: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
fb50: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
fb60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fb70: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
fb80: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
fb90: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
fba0: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
fbb0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
fbc0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fbd0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
fbe0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
fbf0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
fc00: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
fc10: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
fc20: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
fc30: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
fc40: 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
fc50: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
fc60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
fc70: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
fc80: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
fc90: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
fca0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
fcb0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
fcc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fcd0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
fce0: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
fcf0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
fd00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
fd10: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
fd20: 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
fd30: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
fd40: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
fd50: 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
fd60: 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
fd70: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
fd80: 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
fd90: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
fda0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
fdb0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
fdc0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
fdd0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
fde0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
fdf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fe00: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
fe10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
fe20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fe30: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
fe40: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
fe50: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
fe60: 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
fe70: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
fe80: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
fe90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
fea0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
feb0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
fec0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
fed0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
fee0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fef0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
ff00: 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
ff10: 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
ff20: 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
ff30: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
ff40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ff50: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
ff60: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
ff70: 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
ff80: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
ff90: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
ffa0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
ffb0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
ffc0: 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
ffd0: 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
ffe0: 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
fff0: 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
10000 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
10010 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
10020 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
10030 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
10040 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10050 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
10060 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
10070 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
10080 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
10090 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
100a0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
100b0 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
100c0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
100d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
100e0 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
100f0 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
10100 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
10110 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
10120 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
10130 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
10140 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
10150 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
10160 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
10170 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
10180 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
10190 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
101a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
101b0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54    if( v ){.    T
101c0 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
101d0 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  ;.    Db *pDb = 
101e0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
101f0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
10200 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
10210 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
10220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10230 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10240 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
10250 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
10260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10270 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
10280 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10290 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
102a0 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
102b0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
102c0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
102d0 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
102e0 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
102f0 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
10300 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
10310 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
10320 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
10330 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
10340 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
10350 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
10360 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
10370 70 54 61 62 29 3b 0a 20 20 20 20 77 68 69 6c 65  pTab);.    while
10380 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
10390 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
103a0 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
103b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  Tab->pSchema || 
103c0 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67  .          pTrig
103d0 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  ger->pSchema==db
103e0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
103f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10400 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
10410 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
10420 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  );.      pTrigge
10430 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
10440 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  ext;.    }..#ifn
10450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10460 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
10470 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
10480 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
10490 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
104a0 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
104b0 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20  with.    ** the 
104c0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
104d0 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
104e0 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
104f0 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
10500 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
10510 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
10520 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
10530 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
10540 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20   to.    ** move 
10550 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
10560 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
10570 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
10580 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f  um mode)..    */
10590 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
105a0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
105b0 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
105c0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
105d0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
105e0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
105f0 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
10600 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
10610 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
10620 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
10630 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
10640 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
10650 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
10660 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10670 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
10680 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
10690 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
106a0 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
106b0 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
106c0 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
106d0 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
106e0 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
106f0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
10700 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
10710 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
10720 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
10730 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
10740 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
10750 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
10760 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
10770 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
10780 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
10790 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
107a0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
107b0 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
107c0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
107d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
107e0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
107f0 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
10800 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
10810 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
10820 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
10830 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  '",.        pDb-
10840 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
10850 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
10860 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  >zName);..    /*
10870 20 44 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73   Drop any statis
10880 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71  tics from the sq
10890 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
108a0 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a  , if it exists *
108b0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
108c0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
108d0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64  sqlite_stat1", d
108e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
108f0 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
10900 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10910 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
10920 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
10930 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
10940 45 20 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e  E tbl=%Q", pDb->
10950 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
10960 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
10970 7d 0a 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  }..    if( !isVi
10980 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
10990 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
109a0 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
109b0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
109c0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
109d0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
109e0 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
109f0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
10a00 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
10a10 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
10a20 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ie..    */.    i
10a30 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10a40 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
10a50 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10a60 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
10a70 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
10a80 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
10a90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10aa0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
10ab0 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
10ac0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10ad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
10ae0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
10af0 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  e, iDb);.  }.  s
10b00 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
10b10 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
10b20 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
10b30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
10b40 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
10b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
10b60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10b70 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
10b80 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
10b90 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
10ba0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
10bb0 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
10bc0 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
10bd0 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
10be0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
10bf0 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
10c00 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
10c10 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
10c20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
10c30 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
10c40 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
10c50 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
10c60 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
10c70 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
10c80 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
10c90 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
10ca0 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
10cb0 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
10cc0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
10cd0 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
10ce0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
10cf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
10d00 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
10d10 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
10d20 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
10d30 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
10d40 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
10d50 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
10d60 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
10d70 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
10d80 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
10d90 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
10da0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
10db0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
10dc0 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
10dd0 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
10de0 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
10df0 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
10e00 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
10e10 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
10e20 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
10e30 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
10e40 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
10e50 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
10e60 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
10e70 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
10e80 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
10e90 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
10ea0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10eb0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
10ec0 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
10ed0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
10ee0 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
10ef0 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
10f00 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
10f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10f20 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
10f30 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
10f40 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
10f50 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
10f60 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10f70 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
10f80 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
10f90 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
10fa0 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
10fb0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10fc0 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
10fd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10fe0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
10ff0 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
11000 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
11010 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
11020 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
11030 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
11040 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
11050 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
11060 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
11070 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
11080 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
11090 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
110a0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
110b0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
110c0 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
110d0 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
110e0 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
110f0 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
11100 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
11110 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11120 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
11130 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
11140 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
11150 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
11160 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
11170 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
11180 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
11190 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
111a0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
111b0 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
111c0 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
111d0 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
111e0 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
111f0 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
11200 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11210 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
11220 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
11230 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
11240 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
11250 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
11260 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
11270 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
11280 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
11290 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
112a0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
112b0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
112c0 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
112d0 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
112e0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
112f0 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
11300 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
11310 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
11320 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
11330 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11340 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
11350 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
11360 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
11370 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
11380 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
11390 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
113a0 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
113b0 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
113c0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
113d0 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
113e0 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
113f0 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
11400 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
11410 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
11420 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
11430 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
11440 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
11450 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
11460 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
11470 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
11480 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
11490 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
114a0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
114b0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
114c0 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
114d0 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
114e0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
114f0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11500 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
11510 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
11520 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
11530 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11540 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
11550 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
11560 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
11570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11580 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
11590 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
115a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
115b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
115c0 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
115d0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
115e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
115f0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
11600 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
11610 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
11620 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
11630 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
11640 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
11650 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
11660 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
11670 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
11680 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
11690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
116a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
116b0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
116c0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
116d0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
116e0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
116f0 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
11700 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
11710 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
11720 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
11730 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
11740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
11750 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
11760 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
11770 6c 65 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28  leteConf = (u8)(
11780 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 0a 20  flags & 0xff);. 
11790 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f   pFKey->updateCo
117a0 6e 66 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73  nf = (u8)((flags
117b0 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b   >> 8 ) & 0xff);
117c0 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
117d0 43 6f 6e 66 20 3d 20 28 75 38 29 28 28 66 6c 61  Conf = (u8)((fla
117e0 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66  gs >> 16 ) & 0xf
117f0 66 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  f);..  /* Link t
11800 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
11810 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
11820 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
11830 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
11840 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
11850 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
11860 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11870 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20   pFKey);.#endif 
11880 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
11890 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
118a0 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
118b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
118c0 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  db, pFromCol);. 
118d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
118e0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f  Delete(db, pToCo
118f0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
11900 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11910 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
11920 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
11930 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
11940 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
11950 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
11960 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
11970 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
11980 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
11990 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
119a0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
119b0 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
119c0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
119d0 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
119e0 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
119f0 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
11a00 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
11a10 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
11a20 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
11a30 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
11a40 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
11a50 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
11a60 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
11a70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
11a80 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
11a90 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
11aa0 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
11ab0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
11ac0 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
11ad0 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
11ae0 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
11af0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66  .  assert( isDef
11b00 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65  erred==0 || isDe
11b10 66 65 72 72 65 64 3d 3d 31 20 29 3b 0a 20 20 70  ferred==1 );.  p
11b20 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
11b30 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
11b40 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
11b50 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11b60 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
11b70 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
11b80 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
11b90 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
11ba0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
11bb0 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
11bc0 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
11bd0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
11be0 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
11bf0 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
11c00 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
11c10 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
11c20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
11c30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
11c40 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
11c50 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
11c60 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
11c70 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
11c80 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
11c90 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
11ca0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
11cb0 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
11cc0 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
11cd0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
11ce0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
11cf0 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
11d00 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
11d10 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
11d20 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
11d30 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
11d40 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
11d50 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
11d60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11d70 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
11d80 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
11d90 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
11da0 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
11db0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
11dc0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
11dd0 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
11de0 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
11df0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
11e00 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
11e10 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
11e20 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
11e30 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
11e40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11e50 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
11e60 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
11e70 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
11e80 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
11e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
11ea0 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
11eb0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e  loop */.  int tn
11ec0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
11ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
11ee0 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a   page of index *
11ef0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
11f20 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
11f30 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
11f40 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
11f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f60 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72    /* KeyInfo for
11f70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
11f80 72 65 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20  regIdxKey;      
11f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11fa0 67 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69  gisters containi
11fb0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ng the index key
11fc0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
11fd0 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
11fe0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
11ff0 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c   holding assembl
12000 69 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ied index record
12010 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12020 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
12030 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
12040 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12050 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
12060 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
12070 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
12080 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
12090 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
120a0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
120b0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
120c0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
120d0 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
120e0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
120f0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
12100 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
12110 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
12120 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65  if..  /* Require
12130 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
12140 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65   the table to pe
12150 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61  rform this opera
12160 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
12170 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
12180 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
12190 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 1, pTab->zNa
121a0 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  me);..  v = sqli
121b0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
121c0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
121d0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
121e0 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
121f0 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52  .    tnum = memR
12200 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  ootPage;.  }else
12210 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
12220 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73  dex->tnum;.    s
12230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12240 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
12250 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  um, iDb);.  }.  
12260 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
12270 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
12280 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71  e, pIndex);.  sq
12290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
122a0 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
122b0 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62   iIdx, tnum, iDb
122c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
122d0 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70         (char *)p
122e0 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
122f0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20  HANDOFF);.  if( 
12300 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
12310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12320 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
12330 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70  .  }.  sqlite3Op
12340 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
12350 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
12360 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
12370 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
12380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12390 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
123a0 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
123b0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
123c0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  eg(pParse);.  re
123d0 67 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  gIdxKey = sqlite
123e0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
123f0 79 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  y(pParse, pIndex
12400 2c 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72  , iTab, regRecor
12410 64 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e  d, 1);.  if( pIn
12420 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
12430 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 63 6f 6e  _None ){.    con
12440 73 74 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20  st int regRowid 
12450 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49  = regIdxKey + pI
12460 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
12470 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 32 20     const int j2 
12480 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
12490 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
124a0 0a 20 20 20 20 76 6f 69 64 20 2a 20 63 6f 6e 73  .    void * cons
124b0 74 20 70 52 65 67 4b 65 79 20 3d 20 53 51 4c 49  t pRegKey = SQLI
124c0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72 65  TE_INT_TO_PTR(re
124d0 67 49 64 78 4b 65 79 29 3b 0a 0a 20 20 20 20 2f  gIdxKey);..    /
124e0 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20  * The registers 
124f0 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
12500 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f  OP_IsUnique opco
12510 64 65 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65  de were allocate
12520 64 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 73  d.    ** using s
12530 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
12540 67 65 28 29 20 69 6e 73 69 64 65 20 6f 66 20 74  ge() inside of t
12550 68 65 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  he sqlite3Genera
12560 74 65 49 6e 64 65 78 4b 65 79 28 29 0a 20 20 20  teIndexKey().   
12570 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20   ** call above. 
12580 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 61 74  Just before that
12590 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 66 72   function was fr
125a0 65 65 64 20 74 68 65 79 20 77 65 72 65 20 72 65  eed they were re
125b0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 28 6d  leased.    ** (m
125c0 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ade available to
125d0 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f   the compiler fo
125e0 72 20 72 65 75 73 65 29 20 75 73 69 6e 67 20 0a  r reuse) using .
125f0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65      ** sqlite3Re
12600 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 29  leaseTempRange()
12610 2e 20 53 6f 20 69 6e 20 73 6f 6d 65 20 77 61 79  . So in some way
12620 73 20 68 61 76 69 6e 67 20 74 68 65 20 4f 50 5f  s having the OP_
12630 49 73 55 6e 69 71 75 65 0a 20 20 20 20 2a 2a 20  IsUnique.    ** 
12640 6f 70 63 6f 64 65 20 75 73 65 20 74 68 65 20 76  opcode use the v
12650 61 6c 75 65 73 20 73 74 6f 72 65 64 20 77 69 74  alues stored wit
12660 68 69 6e 20 73 65 65 6d 73 20 64 61 6e 67 65 72  hin seems danger
12670 6f 75 73 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  ous. However, si
12680 6e 63 65 0a 20 20 20 20 2a 2a 20 77 65 20 63 61  nce.    ** we ca
12690 6e 20 62 65 20 73 75 72 65 20 74 68 61 74 20 6e  n be sure that n
126a0 6f 20 6f 74 68 65 72 20 74 65 6d 70 20 72 65 67  o other temp reg
126b0 69 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e  isters have been
126c0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
126d0 2a 20 73 69 6e 63 65 20 73 71 6c 69 74 65 33 52  * since sqlite3R
126e0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
126f0 29 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 69 74  ) was called, it
12700 20 69 73 20 73 61 66 65 20 74 6f 20 64 6f 20 73   is safe to do s
12710 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  o..    */.    sq
12720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12730 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20  v, OP_IsUnique, 
12740 69 49 64 78 2c 20 6a 32 2c 20 72 65 67 52 6f 77  iIdx, j2, regRow
12750 69 64 2c 20 70 52 65 67 4b 65 79 2c 20 50 34 5f  id, pRegKey, P4_
12760 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69  INT32);.    sqli
12770 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
12780 74 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  t(.        pPars
12790 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 22 69 6e  e, OE_Abort, "in
127a0 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
127b0 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
127c0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20  4_STATIC);.  }. 
127d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
127e0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
127f0 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63  rt, iIdx, regRec
12800 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
12810 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
12820 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
12830 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
12840 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12850 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
12860 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12870 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
12880 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
12890 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
128a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
128b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
128c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
128d0 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
128e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
128f0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
12900 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
12910 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
12920 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
12930 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
12940 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
12950 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
12960 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
12970 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
12980 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
12990 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
129a0 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
129b0 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
129c0 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
129d0 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
129e0 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
129f0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
12a00 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
12a10 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
12a20 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
12a30 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
12a40 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
12a50 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
12a60 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
12a70 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
12a80 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
12a90 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
12aa0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
12ab0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
12ac0 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
12ad0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
12ae0 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
12af0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
12b00 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
12b10 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
12b20 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
12b30 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12b40 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
12b50 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
12b60 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
12b70 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
12b80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
12b90 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
12ba0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
12bb0 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
12bc0 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
12bd0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
12be0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
12bf0 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
12c00 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
12c10 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
12c20 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
12c30 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
12c40 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
12c50 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
12c60 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
12c70 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
12c80 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
12c90 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
12ca0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
12cb0 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
12cc0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
12cd0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
12ce0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
12cf0 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
12d00 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
12d10 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
12d20 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
12d30 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
12d40 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
12d50 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
12d60 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
12d70 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
12d80 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
12d90 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
12da0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
12db0 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
12dc0 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
12dd0 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
12de0 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
12df0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
12e00 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
12e10 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
12e20 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
12e30 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
12e40 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
12e50 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
12e60 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
12e70 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
12e80 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
12e90 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
12ea0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
12eb0 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
12ec0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
12ed0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
12ee0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12ef0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
12f00 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
12f10 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
12f20 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  lId;        /* F
12f30 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
12f40 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
12f50 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
12f60 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
12f70 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
12f80 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
12f90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
12fa0 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
12fb0 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
12fc0 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
12fd0 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
12fe0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12ff0 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
13000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13010 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
13020 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
13030 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
13040 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
13050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13060 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
13070 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
13080 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
13090 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
130a0 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
130b0 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
130c0 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
130d0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
130e0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
130f0 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
13100 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
13110 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
13120 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
13130 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  0;.  char *zExtr
13140 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  a;..  assert( pS
13150 74 61 72 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21  tart==0 || pEnd!
13160 3d 30 20 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75  =0 ); /* pEnd mu
13170 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  st be non-NULL i
13180 66 20 70 53 74 61 72 74 20 69 73 20 2a 2f 0a 20  f pStart is */. 
13190 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
131a0 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20  >nErr==0 );     
131b0 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
131c0 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
131d0 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
131e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
131f0 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
13200 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
13210 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13220 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
13230 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
13240 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
13250 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13260 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13270 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
13280 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
13290 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
132a0 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
132b0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
132c0 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
132d0 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
132e0 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
132f0 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
13300 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
13310 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
13320 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
13330 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
13340 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
13350 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
13360 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
13370 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
13380 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
13390 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
133a0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
133b0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
133c0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
133d0 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
133e0 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
133f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13400 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66  _index;..#ifndef
13410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
13420 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
13430 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
13440 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
13450 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
13460 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
13470 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
13480 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
13490 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
134a0 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
134b0 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
134c0 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
134d0 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
134e0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
134f0 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
13500 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
13510 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
13520 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
13530 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
13540 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
13550 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
13560 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
13570 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
13580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13590 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
135a0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
135b0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
135c0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
135d0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
135e0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
135f0 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
13600 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
13610 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
13620 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
13630 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
13640 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
13650 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
13660 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
13670 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
13680 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
13690 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
136a0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
136b0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
136c0 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
136d0 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
136e0 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
136f0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
13700 28 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d  ( !pTab || db->m
13710 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
13720 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13730 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
13740 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
13750 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13760 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65  chema );.  }else
13770 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
13780 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
13790 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
137a0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
137b0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
137c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
137d0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
137e0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
137f0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
13800 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
13810 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
13820 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
13830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13840 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
13850 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
13860 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
13870 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
13880 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
13890 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  memcmp(&pTab->zN
138a0 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
138b0 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",9)!=0 ){.    
138c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
138d0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
138e0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
138f0 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
13900 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
13910 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13920 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
13930 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
13940 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
13950 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
13960 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13970 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
13980 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
13990 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
139a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
139b0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
139c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
139d0 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
139e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
139f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13a00 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
13a10 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
13a20 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
13a30 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13a40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13a50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
13a60 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
13a70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
13a80 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
13a90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
13aa0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
13ab0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
13ac0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
13ad0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
13ae0 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
13af0 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
13b00 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
13b10 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
13b20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
13b30 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
13b40 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
13b50 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
13b60 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
13b70 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
13b80 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
13b90 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
13ba0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
13bb0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
13bc0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
13bd0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
13be0 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
13bf0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
13c00 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
13c10 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
13c20 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
13c30 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
13c40 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13c50 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
13c60 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
13c70 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
13c80 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
13c90 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
13ca0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
13cb0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
13cc0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
13cd0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13ce0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
13cf0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
13d00 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
13d10 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
13d20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13d30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13d40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
13d50 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
13d60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13d70 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
13d80 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
13d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13da0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
13db0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13dc0 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
13dd0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
13de0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13df0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
13e00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13e10 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
13e20 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
13e30 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
13e40 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
13e50 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
13e60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13e70 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
13e80 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
13e90 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
13ea0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
13eb0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13ec0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13ed0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
13ee0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
13ef0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
13f00 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
13f10 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
13f20 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
13f30 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
13f40 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13f50 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
13f60 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
13f70 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
13f80 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
13f90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13fa0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13fb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
13fc0 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
13fd0 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
13fe0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
13ff0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14000 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
14010 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
14020 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e  r *zDb = pDb->zN
14030 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
14040 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14050 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
14060 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
14070 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
14080 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14090 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
140a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
140b0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
140c0 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
140d0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
140e0 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
140f0 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
14100 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
14110 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14120 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
14130 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
14140 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14150 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14160 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14170 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
14180 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
14190 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
141a0 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
141b0 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
141c0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
141d0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
141e0 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
141f0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
14200 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
14210 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
14220 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
14230 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14240 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20  ){.    nullId.z 
14250 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  = pTab->aCol[pTa
14260 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
14270 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d  ;.    nullId.n =
14280 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
14290 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a  ((char*)nullId.z
142a0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
142b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
142c0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
142d0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  0);.    if( pLis
142e0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
142f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14300 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
14310 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
14320 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64  , pList, &nullId
14330 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  , 0);.    pList-
14340 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
14350 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b  = (u8)sortOrder;
14360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
14370 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
14380 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
14390 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
143a0 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
143b0 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
143c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
143d0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
143e0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
143f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14400 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
14410 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
14420 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
14430 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
14440 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72  q *pColl = pExpr
14450 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f  ->pColl;.      /
14460 2a 20 45 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d  * Either pColl!=
14470 30 20 6f 72 20 74 68 65 72 65 20 77 61 73 20 61  0 or there was a
14480 6e 20 4f 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20  n OOM failure.  
14490 42 75 74 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20  But if an OOM.  
144a0 20 20 20 20 2a 2a 20 66 61 69 6c 75 72 65 20 77      ** failure w
144b0 65 20 68 61 76 65 20 71 75 69 74 20 62 65 66 6f  e have quit befo
144c0 72 65 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  re reaching this
144d0 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20   point. */.     
144e0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c   if( ALWAYS(pCol
144f0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  l) ){.        nE
14500 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c  xtra += (1 + sql
14510 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
14520 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
14530 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14540 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
14550 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
14560 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
14570 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
14580 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
14590 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  .  nCol = pList-
145a0 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
145b0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
145c0 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20  ocZero(db, .    
145d0 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20    sizeof(Index) 
145e0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
145f0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
14600 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  e  */.      size
14610 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20  of(int)*nCol +  
14620 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14630 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
14640 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
14650 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20  )*(nCol+1) +    
14660 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
14670 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
14680 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e  sizeof(char *)*n
14690 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  Col +        /* 
146a0 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
146b0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
146c0 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  (u8)*nCol +     
146d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
146e0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
146f0 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20      nName + 1 + 
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20   /* Index.zName 
14720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45       */.      nE
14730 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
14740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14750 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14760 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20   names */.  );. 
14770 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14780 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
14790 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
147a0 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
147b0 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
147c0 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29  r**)(&pIndex[1])
147d0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
147e0 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26  lumn = (int *)(&
147f0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  pIndex->azColl[n
14800 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
14810 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73  >aiRowEst = (uns
14820 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78  igned *)(&pIndex
14830 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d  ->aiColumn[nCol]
14840 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  );.  pIndex->aSo
14850 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
14860 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  (&pIndex->aiRowE
14870 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70  st[nCol+1]);.  p
14880 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
14890 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
148a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
148b0 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28  ]);.  zExtra = (
148c0 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
148d0 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29  >zName[nName+1])
148e0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
148f0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
14900 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
14910 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
14920 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
14930 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
14940 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
14950 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
14960 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
14970 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38  >autoIndex = (u8
14980 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70  )(pName==0);.  p
14990 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d  Index->pSchema =
149a0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
149b0 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65  chema;..  /* Che
149c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
149d0 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53  should honor DES
149e0 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e  C requests on in
149f0 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  dex columns.  */
14a00 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
14a10 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
14a20 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f  >=4 ){.    sortO
14a30 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20  rderMask = -1;  
14a40 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a   /* Honor DESC *
14a50 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
14a60 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30  ortOrderMask = 0
14a70 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44  ;    /* Ignore D
14a80 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ESC */.  }..  /*
14a90 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
14aa0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
14ab0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
14ac0 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
14ad0 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
14ae0 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
14af0 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
14b00 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
14b10 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
14b20 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
14b30 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  found..  **.  **
14b40 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65   TODO:  Add a te
14b50 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
14b60 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
14b70 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65  lumn is not name
14b80 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  d.  ** more than
14b90 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65   once within the
14ba0 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e   same index.  On
14bb0 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73  ly the first ins
14bc0 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68  tance of.  ** th
14bd0 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76  e column will ev
14be0 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68  er be used by th
14bf0 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f  e optimizer.  No
14c00 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68  te that using th
14c10 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75  e.  ** same colu
14c20 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  mn more than onc
14c30 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65  e cannot be an e
14c40 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61  rror because tha
14c50 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72  t would .  ** br
14c60 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f  eak backwards co
14c70 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74  mpatibility - it
14c80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77   needs to be a w
14c90 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  arning..  */.  f
14ca0 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
14cb0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
14cc0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
14cd0 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
14ce0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14cf0 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
14d00 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
14d10 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
14d20 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
14d30 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
14d40 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
14d70 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  uence name */.. 
14d80 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62     for(j=0, pTab
14d90 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
14da0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
14db0 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  +, pTabCol++){. 
14dc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14dd0 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65  StrICmp(zColName
14de0 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65  , pTabCol->zName
14df0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
14e00 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
14e10 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
14e20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14e30 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
14e40 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
14e50 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
14e60 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
14e70 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  e, zColName);.  
14e80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14e90 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14ea0 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
14eb0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
14ec0 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
14ed0 69 6f 6e 20 6f 66 20 74 68 65 20 41 4c 57 41 59  ion of the ALWAY
14ee0 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  S(pListItem->pEx
14ef0 70 72 2d 3e 70 43 6f 6c 6c 29 3a 20 20 42 65 63  pr->pColl):  Bec
14f00 61 75 73 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  ause of.    ** t
14f10 68 65 20 77 61 79 20 74 68 65 20 22 69 64 78 6c  he way the "idxl
14f20 69 73 74 22 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ist" non-termina
14f30 6c 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  l is constructed
14f40 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 0a   by the parser,.
14f50 20 20 20 20 2a 2a 20 69 66 20 70 4c 69 73 74 49      ** if pListI
14f60 74 65 6d 2d 3e 70 45 78 70 72 20 69 73 20 6e 6f  tem->pExpr is no
14f70 74 20 6e 75 6c 6c 20 74 68 65 6e 20 65 69 74 68  t null then eith
14f80 65 72 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  er pListItem->pE
14f90 78 70 72 2d 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a  xpr->pColl.    *
14fa0 2a 20 6d 75 73 74 20 65 78 69 73 74 20 6f 72 20  * must exist or 
14fb0 65 6c 73 65 20 74 68 65 72 65 20 6d 75 73 74 20  else there must 
14fc0 68 61 76 65 20 62 65 65 6e 20 61 6e 20 4f 4f 4d  have been an OOM
14fd0 20 65 72 72 6f 72 2e 20 20 42 75 74 20 69 66 20   error.  But if 
14fe0 74 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 61 73  there.    ** was
14ff0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2c 20 77   an OOM error, w
15000 65 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 72 65  e would never re
15010 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20  ach this point. 
15020 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
15030 49 74 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 41  Item->pExpr && A
15040 4c 57 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d  LWAYS(pListItem-
15050 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 20 29  >pExpr->pColl) )
15060 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
15070 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  l;.      zColl =
15080 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
15090 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b  r->pColl->zName;
150a0 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73  .      nColl = s
150b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
150c0 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20  Coll) + 1;.     
150d0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
150e0 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  =nColl );.      
150f0 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a  memcpy(zExtra, z
15100 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20  Coll, nColl);.  
15110 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74      zColl = zExt
15120 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61  ra;.      zExtra
15130 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20   += nColl;.     
15140 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c   nExtra -= nColl
15150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15160 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
15170 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
15180 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c        if( !zColl
15190 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
151a0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
151b0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
151c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
151d0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
151e0 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  & !sqlite3Locate
151f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15200 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
15210 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
15220 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
15230 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
15240 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
15250 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
15260 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
15270 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
15280 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
15290 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
152a0 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75  er[i] = (u8)requ
152b0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
152c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
152d0 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
152e0 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
152f0 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
15300 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
15310 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
15320 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
15330 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
15340 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
15350 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
15360 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
15370 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
15380 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
15390 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
153a0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
153b0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
153c0 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
153d0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
153e0 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
153f0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
15400 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
15410 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
15420 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
15430 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
15440 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
15450 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
15460 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
15470 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
15480 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
15490 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
154a0 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
154b0 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
154c0 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
154d0 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
154e0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
154f0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
15500 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
15510 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
15520 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
15530 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
15540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20    **.    ** Two 
15550 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
15560 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
15570 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
15580 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
15590 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70  ** (and thus sup
155a0 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63  pressing the sec
155b0 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66  ond one) even if
155c0 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65   they have diffe
155d0 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74  rent.    ** sort
155e0 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a   orders..    **.
155f0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
15600 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f  are different co
15610 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
15620 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75  s or if the colu
15630 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  mns of.    ** th
15640 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63  e constraint occ
15650 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ur in different 
15660 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65  orders, then the
15670 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
15680 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
15690 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20  ed distinct and 
156a0 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73  both result in s
156b0 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e  eparate indices.
156c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
156d0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
156e0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
156f0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
15700 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
15710 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
15720 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
15730 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
15740 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15750 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
15760 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15770 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
15780 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
15790 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
157a0 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
157b0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
157c0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
157d0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
157e0 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
157f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
15800 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
15810 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
15820 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
15830 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
15840 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
15850 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  eak;.        z1 
15860 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
15870 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  ];.        z2 = 
15880 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  pIndex->azColl[k
15890 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
158a0 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33  1!=z2 && sqlite3
158b0 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
158c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
158d0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
158e0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
158f0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15900 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
15910 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
15920 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
15930 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
15940 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
15950 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
15960 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
15970 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
15980 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
15990 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
159a0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
159b0 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
159c0 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
159d0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
159e0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
159f0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
15a00 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
15a10 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
15a20 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
15a30 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
15a40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
15a50 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
15a60 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
15a70 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
15a80 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
15a90 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
15aa0 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
15ab0 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
15ac0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
15ad0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
15ae0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
15af0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
15b00 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
15b10 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
15b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15b30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15b50 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
15b60 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
15b70 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
15b80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15b90 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
15ba0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
15bb0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
15bc0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
15bd0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
15be0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
15bf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15c00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
15c10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
15c20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15c30 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
15c40 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
15c50 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
15c60 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
15c70 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
15c80 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
15c90 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
15ca0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
15cb0 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
15cc0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
15cd0 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
15ce0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
15cf0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
15d10 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c  ndex->zName, sql
15d20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e  ite3Strlen30(pIn
15d30 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  dex->zName),.   
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a         pIndex);.
15d60 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
15d70 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
15d80 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
15d90 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
15da0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  led */.      db-
15db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
15dc0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  1;.      goto ex
15dd0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15de0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
15df0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
15e00 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
15e10 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
15e20 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
15e30 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
15e40 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
15e50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
15e60 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
15e70 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
15e80 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
15e90 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
15ea0 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
15eb0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
15ec0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
15ed0 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
15ee0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
15ef0 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
15f00 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
15f10 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62    **.  ** The db
15f20 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
15f30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
15f40 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
15f50 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
15f60 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69   command.  db->i
15f70 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68  nit.busy is 1 wh
15f80 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73  en a database is
15f90 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a   opened and .  *
15fa0 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  * CREATE INDEX s
15fb0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65  tatements are re
15fc0 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ad out of the ma
15fd0 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a  ster table.  In.
15fe0 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20    ** the latter 
15ff0 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61  case the index a
16000 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e  lready exists on
16010 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20   disk, which is 
16020 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  why.  ** we don'
16030 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61  t want to recrea
16040 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  te it..  **.  **
16050 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
16060 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
16070 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
16080 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   as a primary ke
16090 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  y.  ** or UNIQUE
160a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61   constraint of a
160b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
160c0 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
160d0 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
160e0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
160f0 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
16100 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
16110 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
16120 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
16130 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
16140 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f 2a  .  */.  else{ /*
16150 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
16160 73 79 3d 3d 30 20 29 20 2a 2f 0a 20 20 20 20 56  sy==0 ) */.    V
16170 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
16180 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
16190 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
161a0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
161b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
161c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
161d0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
161e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
161f0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
16200 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
16210 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
16220 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
16230 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
16240 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
16250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16260 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
16270 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
16280 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  iMem);..    /* G
16290 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
162a0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
162b0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
162c0 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
162d0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
162e0 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
162f0 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
16300 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
16310 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
16320 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
16330 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
16340 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
16350 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
16360 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
16370 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
16380 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
16390 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
163a0 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
163b0 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20   " UNIQUE",.    
163c0 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e      pEnd->z - pN
163d0 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20  ame->z + 1,.    
163e0 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
163f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16400 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
16410 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
16420 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
16430 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
16440 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
16450 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
16460 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
16470 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
16480 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
16490 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
164a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
164b0 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
164c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
164d0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
164e0 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
164f0 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
16500 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
16510 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
16520 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
16530 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
16540 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
16550 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
16560 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
16570 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
16580 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
16590 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
165a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
165b0 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
165c0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
165d0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
165e0 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
165f0 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
16600 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
16610 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
16620 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
16630 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
16640 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
16650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16660 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
16670 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
16680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
16690 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
166a0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
166b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
166c0 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
166d0 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20  ma, iDb, 0, 0,. 
166e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
166f0 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
16700 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
16710 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d  zName), P4_DYNAM
16720 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
16730 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16740 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20  OP_Expire, 0);. 
16750 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
16760 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
16770 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
16780 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
16790 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
167a0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
167b0 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
167c0 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
167d0 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
167e0 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
167f0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
16800 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
16810 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74  rrect constraint
16820 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63   check.  ** proc
16830 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74  essing (in sqlit
16840 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
16850 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73  aintChecks()) as
16860 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50   part of.  ** UP
16870 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
16880 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20  statements.  .  
16890 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
168a0 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
168b0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
168c0 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
168d0 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
168e0 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
168f0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
16900 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
16910 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
16920 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
16930 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
16940 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
16950 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
16960 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
16970 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
16980 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
16990 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
169a0 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
169b0 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
169c0 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
169d0 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
169e0 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
169f0 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
16a00 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
16a10 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
16a20 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
16a30 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
16a40 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
16a50 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
16a60 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
16a70 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
16a80 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
16a90 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
16aa0 5f 66 72 65 65 28 70 49 6e 64 65 78 2d 3e 7a 43  _free(pIndex->zC
16ab0 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  olAff);.    sqli
16ac0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
16ad0 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ndex);.  }.  sql
16ae0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
16af0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
16b00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
16b10 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61  elete(db, pTblNa
16b20 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
16b30 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
16b40 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
16b50 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
16b60 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
16b70 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
16b80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
16b90 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
16ba0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
16bb0 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
16bc0 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
16bd0 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
16be0 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20  t[0] is suppose 
16bf0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
16c00 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
16c10 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
16c20 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
16c30 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
16c40 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
16c50 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
16c60 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
16c70 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
16c80 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
16c90 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
16ca0 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
16cb0 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
16cc0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
16cd0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
16ce0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
16cf0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
16d00 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
16d10 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
16d20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20  combiniation of 
16d30 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
16d40 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
16d50 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
16d60 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
16d70 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
16d80 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
16d90 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
16da0 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
16db0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
16dc0 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
16dd0 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
16de0 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
16df0 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
16e00 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
16e10 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
16e20 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
16e30 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
16e40 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
16e50 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
16e60 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
16e70 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
16e80 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
16e90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
16ea0 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
16eb0 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
16ec0 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e  gned *a = pIdx->
16ed0 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20  aiRowEst;.  int 
16ee0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d  i;.  assert( a!=
16ef0 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30  0 );.  a[0] = 10
16f00 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70  00000;.  for(i=p
16f10 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e  Idx->nColumn; i>
16f20 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b  =5; i--){.    a[
16f30 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68  i] = 5;.  }.  wh
16f40 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20  ile( i>=1 ){.   
16f50 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a   a[i] = 11 - i;.
16f60 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69      i--;.  }.  i
16f70 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
16f80 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
16f90 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   a[pIdx->nColumn
16fa0 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = 1;.  }.}../*
16fb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16fc0 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
16fd0 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
16fe0 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
16ff0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
17000 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
17010 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
17020 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
17030 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
17040 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
17050 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
17060 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
17070 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
17080 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
17090 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
170a0 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
170b0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
170c0 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c  ;   /* Never cal
170d0 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
170e0 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
170f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17100 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17110 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
17120 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
17130 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
17140 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
17150 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
17160 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
17170 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
17180 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
17190 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
171a0 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
171b0 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
171c0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
171d0 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
171e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
171f0 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ifExists ){.    
17200 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17210 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
17220 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
17230 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
17240 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
17250 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
17260 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17270 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
17280 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
17290 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
172a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
172b0 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
172c0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
172d0 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
172e0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
172f0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
17300 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
17310 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
17320 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
17330 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
17340 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
17350 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
17360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17370 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
17380 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
17390 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
173a0 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
173b0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
173c0 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
173d0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
173e0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
173f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17400 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
17410 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
17420 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
17430 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
17440 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
17450 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
17460 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17470 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
17480 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
17490 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
174a0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
174b0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
174c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
174d0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
174e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
174f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
17500 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17510 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17520 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
17530 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
17540 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
17550 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
17560 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
17570 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
17580 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
17590 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
175a0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
175b0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
175c0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
175d0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
175e0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
175f0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
17600 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
17610 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
17620 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
17630 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
17640 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49  (iDb),.       pI
17650 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
17660 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
17670 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
17680 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20  "sqlite_stat1", 
17690 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
176a0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
176b0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
176c0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
176d0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
176e0 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45  sqlite_stat1 WHE
176f0 52 45 20 69 64 78 3d 25 51 22 2c 0a 20 20 20 20  RE idx=%Q",.    
17700 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
17710 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  .zName, pIndex->
17720 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
17730 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17740 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
17750 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
17760 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
17770 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
17780 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
17790 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
177a0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
177b0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
177c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
177d0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
177e0 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
177f0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
17800 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
17810 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
17820 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
17830 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 45  y of objects.  E
17840 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
17850 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a  e.** array is sz
17860 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73  Entry bytes in s
17870 69 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ize.  This routi
17880 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  ne allocates a n
17890 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e 20  ew.** object on 
178a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61  the end of the a
178b0 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45  rray..**.** *pnE
178c0 6e 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d 62  ntry is the numb
178d0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61 6c  er of entries al
178e0 72 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20 2a  ready in use.  *
178f0 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74 68  pnAlloc is.** th
17900 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c  e previously all
17910 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 74  ocated size of t
17920 68 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74 53  he array.  initS
17930 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 75  ize is the.** su
17940 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20  ggested initial 
17950 61 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f 63  array size alloc
17960 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
17970 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65   index of the ne
17980 77 20 65 6e 74 72 79 20 69 73 20 72 65 74 75 72  w entry is retur
17990 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a  ned in *pIdx..**
179a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
179b0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
179c0 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  er to the array 
179d0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 69  of objects.  Thi
179e0 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 68  s.** might be th
179f0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 41  e same as the pA
17a00 72 72 61 79 20 70 61 72 61 6d 65 74 65 72 20 6f  rray parameter o
17a10 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  r it might be a 
17a20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f 69  different.** poi
17a30 6e 74 65 72 20 69 66 20 74 68 65 20 61 72 72 61  nter if the arra
17a40 79 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a 2a  y was resized..*
17a50 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41  /.void *sqlite3A
17a60 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
17a70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
17a80 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
17a90 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
17aa0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
17ab0 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20    void *pArray, 
17ac0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
17ad0 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20  objects.  Might 
17ae0 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a  be reallocated *
17af0 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c  /.  int szEntry,
17b00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17b10 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   each object in 
17b20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  the array */.  i
17b30 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20 20  nt initSize,    
17b40 20 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69 6e   /* Suggested in
17b50 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e  itial allocation
17b60 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  , in elements */
17b70 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c  .  int *pnEntry,
17b80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17b90 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e  f objects curren
17ba0 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  tly in use */.  
17bb0 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20  int *pnAlloc,   
17bc0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
17bd0 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
17be0 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73  ion, in elements
17bf0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
17c00 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
17c10 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
17c20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
17c30 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
17c40 20 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e 3d   if( *pnEntry >=
17c50 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20   *pnAlloc ){.   
17c60 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20   void *pNew;.   
17c70 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20   int newSize;.  
17c80 20 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70 6e    newSize = (*pn
17c90 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74 53  Alloc)*2 + initS
17ca0 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ize;.    pNew = 
17cb0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
17cc0 28 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65 77  (db, pArray, new
17cd0 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  Size*szEntry);. 
17ce0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
17cf0 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  {.      *pIdx = 
17d00 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
17d10 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20   pArray;.    }. 
17d20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 73 71     *pnAlloc = sq
17d30 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
17d40 65 28 64 62 2c 20 70 4e 65 77 29 2f 73 7a 45 6e  e(db, pNew)/szEn
17d50 74 72 79 3b 0a 20 20 20 20 70 41 72 72 61 79 20  try;.    pArray 
17d60 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
17d70 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
17d80 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e  .  memset(&z[*pn
17d90 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d  Entry * szEntry]
17da0 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
17db0 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72   *pIdx = *pnEntr
17dc0 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  y;.  ++*pnEntry;
17dd0 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
17de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
17df0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
17e00 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
17e10 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
17e20 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
17e30 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
17e40 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
17e50 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
17e60 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
17e70 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
17e80 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
17e90 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
17ea0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
17eb0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
17ec0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
17ed0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
17ee0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
17ef0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
17f00 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
17f10 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
17f20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
17f30 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
17f40 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
17f50 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  >a = sqlite3Arra
17f60 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
17f70 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74   db,.      pList
17f80 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
17f90 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
17fa0 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26        5,.      &
17fb0 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
17fc0 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63    &pList->nAlloc
17fd0 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
17fe0 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
17ff0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
18000 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
18010 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18020 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
18030 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
18040 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18050 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74  , pToken);.  ret
18060 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
18070 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
18080 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
18090 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
180a0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  e(sqlite3 *db, I
180b0 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
180c0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
180d0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
180e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
180f0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
18100 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18110 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e(db, pList->a[i
18120 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
18130 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18140 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
18150 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18160 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
18170 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
18180 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
18190 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
181a0 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
181b0 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
181c0 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
181d0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
181e0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
181f0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
18200 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
18210 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
18220 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
18230 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
18240 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
18250 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
18260 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
18270 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
18280 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
18290 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
182a0 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
182b0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
182c0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
182d0 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
182e0 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
182f0 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
18300 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
18310 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
18320 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
18330 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
18340 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
18350 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
18360 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
18370 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
18380 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
18390 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
183a0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
183b0 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
183c0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
183d0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
183e0 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
183f0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
18400 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
18410 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
18420 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
18430 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
18440 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
18450 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
18460 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
18470 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
18480 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
18490 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
184a0 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
184b0 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
184c0 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
184d0 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
184e0 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
184f0 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
18500 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
18510 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
18520 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68  ocation fails th
18530 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63  e SrcList is unc
18540 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hanged.  The.** 
18550 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18560 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65   flag will be se
18570 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72  t to true..*/.Sr
18580 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
18590 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
185a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
185b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
185c0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
185d0 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72  ify of OOM error
185e0 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
185f0 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
18600 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
18610 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
18620 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
18630 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
18640 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
18650 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
18660 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
18670 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
18680 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
18690 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
186a0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
186b0 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
186c0 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
186d0 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
186e0 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
186f0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
18700 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
18710 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
18720 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
18730 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
18740 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
18750 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
18760 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  eeded */.  if( p
18770 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
18780 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  >pSrc->nAlloc ){
18790 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
187a0 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c  ew;.    int nAll
187b0 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b  oc = pSrc->nSrc+
187c0 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20  nExtra;.    int 
187d0 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d  nGot;.    pNew =
187e0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
187f0 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
18800 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
18810 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
18820 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
18830 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
18840 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
18850 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
18860 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53  .      return pS
18880 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  rc;.    }.    pS
18890 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e  rc = pNew;.    n
188a0 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62  Got = (sqlite3Db
188b0 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
188c0 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70  New) - sizeof(*p
188d0 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72  Src))/sizeof(pSr
188e0 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20  c->a[0])+1;.    
188f0 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  pSrc->nAlloc = (
18900 75 31 36 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  u16)nGot;.  }.. 
18910 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
18920 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
18930 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
18940 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
18950 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
18960 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
18970 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
18980 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
18990 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
189a0 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
189b0 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
189c0 53 72 63 20 2b 3d 20 28 69 31 36 29 6e 45 78 74  Src += (i16)nExt
189d0 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
189e0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
189f0 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
18a00 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
18a10 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
18a20 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
18a30 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
18a40 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
18a50 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
18a60 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
18a70 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
18a80 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
18a90 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
18aa0 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
18ab0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
18ac0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
18ad0 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
18ae0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
18af0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
18b00 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
18b10 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
18b20 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
18b30 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
18b40 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
18b50 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
18b60 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
18b70 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
18b80 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
18b90 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
18ba0 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
18bb0 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
18bc0 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
18bd0 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
18be0 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
18bf0 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
18c00 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
18c10 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
18c20 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
18c30 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
18c40 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
18c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18c60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
18c70 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
18c80 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
18c90 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
18ca0 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
18cb0 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
18cc0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
18cd0 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
18ce0 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
18cf0 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
18d00 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
18d10 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
18d20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
18d30 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
18d40 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
18d50 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
18d60 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
18d70 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
18d80 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
18d90 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
18da0 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
18db0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
18dc0 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
18dd0 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
18de0 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
18df0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
18e00 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
18e10 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
18e20 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
18e30 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
18e40 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
18e50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
18e60 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
18e70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
18e80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
18e90 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
18ea0 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
18eb0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
18ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
18ed0 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
18ee0 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
18ef0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
18f00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18f10 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
18f20 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
18f30 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
18f40 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
18f50 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
18f60 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
18f70 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
18f80 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
18f90 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
18fa0 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
18fb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
18fc0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
18fd0 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
18fe0 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
18ff0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
19000 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
19010 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
19020 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
19030 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
19040 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
19050 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
19060 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
19070 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
19080 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
19090 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
190a0 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
190b0 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
190c0 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
190d0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
190e0 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
190f0 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
19100 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
19110 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
19120 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
19130 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
19140 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
19150 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
19160 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
19170 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19180 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
19190 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
191a0 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
191b0 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
191c0 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66  ithout B */.  if
191d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
191e0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
191f0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
19200 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  , sizeof(SrcList
19210 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
19220 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
19230 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
19240 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  loc = 1;.  }.  p
19250 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72  List = sqlite3Sr
19260 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
19270 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
19280 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64  ->nSrc);.  if( d
19290 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
192a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  ){.    sqlite3Sr
192b0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
192c0 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
192d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rn 0;.  }.  pIte
192e0 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
192f0 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  ist->nSrc-1];.  
19300 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
19310 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
19320 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
19330 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
19340 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20   pDatabase ){.  
19350 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
19360 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
19370 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
19380 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
19390 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
193a0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
193b0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
193c0 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  n(db, pTable);. 
193d0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
193e0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
193f0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61  romToken(db, pDa
19400 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72  tabase);.  retur
19410 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
19420 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72  * Assign VdbeCur
19430 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  sor index number
19440 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
19450 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
19460 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
19470 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
19480 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19490 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
194a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
194b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
194c0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
194d0 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
194e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
194f0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
19500 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
19510 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
19520 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
19530 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
19540 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
19550 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
19560 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
19570 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
19580 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
19590 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
195a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
195b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
195c0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
195d0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
195e0 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
195f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
19600 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
19610 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
19620 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
19630 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
19640 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
19650 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  cListDelete(sqli
19660 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
19670 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
19680 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
19690 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
196a0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
196b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
196c0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
196d0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
196e0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
196f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
19700 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
19710 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
19720 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19730 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
19740 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19750 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41  ee(db, pItem->zA
19760 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lias);.    sqlit
19770 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
19780 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20  em->zIndex);.   
19790 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
197a0 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ble(pItem->pTab)
197b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
197c0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  ectDelete(db, pI
197d0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
197e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
197f0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
19800 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
19810 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
19820 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  , pItem->pUsing)
19830 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
19840 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
19850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19860 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19870 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
19880 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
19890 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
198a0 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
198b0 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
198c0 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
198d0 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
198e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
198f0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
19900 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
19910 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
19920 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
19930 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
19940 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
19950 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
19960 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
19970 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
19980 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
19990 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
199a0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
199b0 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
199c0 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
199d0 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
199e0 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
199f0 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
19a00 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
19a10 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65  has a alias, the
19a20 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
19a30 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
19a40 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
19a50 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
19a60 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
19a70 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
19a80 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
19a90 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
19aa0 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
19ab0 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
19ac0 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
19ad0 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
19ae0 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
19af0 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
19b00 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
19b10 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
19b20 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
19b30 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
19b40 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
19b50 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
19b60 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
19b70 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
19b80 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
19b90 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
19ba0 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
19bb0 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
19bc0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
19bd0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
19be0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c00 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
19c10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19c20 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
19c30 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
19c40 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
19c50 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
19c60 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
19c70 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
19c80 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
19c90 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19ca0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
19cb0 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
19cc0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
19cd0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
19ce0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
19cf0 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
19d00 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
19d10 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
19d20 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
19d30 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
19d40 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
19d50 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
19d60 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
19d70 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
19d80 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
19d90 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
19da0 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
19db0 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
19dc0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
19dd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19de0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
19df0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
19e00 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21  rse->db;.  if( !
19e10 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73  p && (pOn || pUs
19e20 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ing) ){.    sqli
19e30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19e40 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75  se, "a JOIN clau
19e50 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
19e60 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20  efore %s", .    
19e70 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20    (pOn ? "ON" : 
19e80 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a  "USING").    );.
19e90 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
19ea0 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
19eb0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
19ec0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
19ed0 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
19ee0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
19ef0 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72   || NEVER(p->nSr
19f00 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  c==0) ){.    got
19f10 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
19f20 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  ror;.  }.  pItem
19f30 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
19f40 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
19f50 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
19f60 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
19f70 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
19f80 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19f90 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
19fa0 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
19fb0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
19fc0 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
19fd0 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
19fe0 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
19ff0 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
1a000 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
1a010 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
1a020 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
1a030 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1a040 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
1a050 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1a060 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
1a070 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1a080 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
1a090 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1a0a0 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
1a0b0 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
1a0c0 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
1a0d0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1a0e0 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
1a0f0 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
1a100 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
1a110 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1a120 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1a130 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
1a140 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
1a150 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
1a160 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
1a170 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
1a180 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
1a190 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
1a1a0 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20  (p->nSrc>0) ){. 
1a1b0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1a1c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1a1d0 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1a1e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1a1f0 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  tem->notIndexed=
1a200 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e  =0 && pItem->zIn
1a210 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  dex==0 );.    if
1a220 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d  ( pIndexedBy->n=
1a230 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42  =1 && !pIndexedB
1a240 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y->z ){.      /*
1a250 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22   A "NOT INDEXED"
1a260 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70   clause was supp
1a270 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e  lied. See parse.
1a280 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  y .      ** cons
1a290 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f  truct "indexed_o
1a2a0 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  pt" for details.
1a2b0 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   */.      pItem-
1a2c0 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b  >notIndexed = 1;
1a2d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a2e0 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20    pItem->zIndex 
1a2f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1a300 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1a310 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a  b, pIndexedBy);.
1a320 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1a330 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67  ** When building
1a340 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   up a FROM claus
1a350 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c  e in the parser,
1a360 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
1a370 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  or.** is initial
1a380 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ly attached to t
1a390 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e  he left operand.
1a3a0 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67    But the code g
1a3b0 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65  enerator.** expe
1a3c0 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  cts the join ope
1a3d0 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74  rator to be on t
1a3e0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1a3f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1a400 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f  ** Shifts all jo
1a410 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f  in operators fro
1a420 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
1a430 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52  for an entire FR
1a440 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a  OM.** clause..**
1a450 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70  .** Example: Sup
1a460 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73  pose the join is
1a470 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1a480 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61  *           A na
1a490 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
1a4a0 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65   B.**.** The ope
1a4b0 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61  rator is "natura
1a4c0 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20  l cross join".  
1a4d0 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72  The A and B oper
1a4e0 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ands are stored.
1a4f0 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e  ** in p->a[0] an
1a500 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65  d p->a[1], respe
1a510 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61  ctively.  The pa
1a520 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  rser initially s
1a530 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65  tores the.** ope
1a540 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54  rator with A.  T
1a550 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66  his routine shif
1a560 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72  ts that operator
1a570 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76   over to B..*/.v
1a580 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1a590 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28  stShiftJoinType(
1a5a0 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69  SrcList *p){.  i
1a5b0 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a  f( p && p->a ){.
1a5c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1a5d0 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20  or(i=p->nSrc-1; 
1a5e0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
1a5f0 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70   p->a[i].jointyp
1a600 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f  e = p->a[i-1].jo
1a610 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
1a620 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79    p->a[0].jointy
1a630 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
1a640 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
1a650 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1a660 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
1a670 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1a680 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
1a690 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1a6a0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
1a6b0 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
1a6c0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1a6d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a6e0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1a6f0 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1a700 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1a710 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1a720 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1a730 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1a740 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
1a750 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a  EGIN", 0, 0) ){.
1a760 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1a770 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1a780 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1a790 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
1a7a0 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
1a7b0 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
1a7c0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1a7d0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
1a7e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7f0 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  2(v, OP_Transact
1a800 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54  ion, i, (type==T
1a810 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b  K_EXCLUSIVE)+1);
1a820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a830 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1a840 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
1a850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a860 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
1a870 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
1a880 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
1a890 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1a8a0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61  sqlite3CommitTra
1a8b0 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1a8c0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
1a8d0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1a8e0 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
1a8f0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20  arse!=0 );.  db 
1a900 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1a910 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1a920 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  ./*  if( db->aDb
1a930 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
1a940 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71  urn; */.  if( sq
1a950 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1a960 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1a970 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
1a980 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
1a990 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1a9a0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1a9b0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1a9c0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1a9d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a9e0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1a9f0 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
1aa00 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
1aa10 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1aa20 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
1aa30 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
1aa40 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
1aa50 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1aa60 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
1aa70 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1aa80 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1aa90 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
1aaa0 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d  0 );./*  if( db-
1aab0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
1aac0 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66   return; */.  if
1aad0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1aae0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1aaf0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1ab00 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
1ab10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1ab20 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
1ab30 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1ab40 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1ab50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab60 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
1ab70 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
1ab80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ab90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1aba0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
1abb0 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
1abc0 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
1abd0 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
1abe0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
1abf0 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
1ac00 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
1ac10 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
1ac20 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
1ac30 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
1ac40 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
1ac50 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1ac60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
1ac70 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
1ac80 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
1ac90 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1aca0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
1acb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1acc0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
1acd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1ace0 72 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47  r *az[] = { "BEG
1acf0 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  IN", "RELEASE", 
1ad00 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20  "ROLLBACK" };.  
1ad10 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50    assert( !SAVEP
1ad20 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41  OINT_BEGIN && SA
1ad30 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d  VEPOINT_RELEASE=
1ad40 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  =1 && SAVEPOINT_
1ad50 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23  ROLLBACK==2 );.#
1ad60 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76  endif.    if( !v
1ad70 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43   || sqlite3AuthC
1ad80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1ad90 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61  ITE_SAVEPOINT, a
1ada0 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29  z[op], zName, 0)
1adb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1adc0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1add0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
1ade0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1adf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ae00 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65  ddOp4(v, OP_Save
1ae10 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c  point, op, 0, 0,
1ae20 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
1ae30 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
1ae40 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1ae50 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
1ae60 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
1ae70 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
1ae80 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
1ae90 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
1aea0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
1aeb0 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
1aec0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
1aed0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
1aee0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
1aef0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1af00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1af10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1af20 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
1af30 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
1af40 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
1af50 6e 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69  nt rc;.    stati
1af60 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
1af70 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
1af80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1af90 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
1afa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1afb0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
1afc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1afd0 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
1afe0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
1aff0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
1b000 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1b010 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
1b020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b030 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
1b040 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  , 0, SQLITE_DEFA
1b050 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  ULT_CACHE_SIZE, 
1b060 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  flags,.         
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b080 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62          &db->aDb
1b090 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66  [1].pBt);.    if
1b0a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b0b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b0c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b0d0 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
1b0e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
1b0f0 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
1b100 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
1b110 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
1b120 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
1b130 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
1b140 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1b150 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
1b160 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1b170 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c  TE_InTrans)==0 |
1b180 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
1b190 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b1a0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
1b1b0 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
1b1c0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64  3PagerJournalMod
1b1d0 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e(sqlite3BtreePa
1b1e0 67 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ger(db->aDb[1].p
1b1f0 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Bt),.           
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c   db->dfltJournal
1b220 4d 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Mode);.  }.  ret
1b230 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1b240 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
1b250 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
1b260 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
1b270 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
1b280 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
1b290 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
1b2a0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1b2b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
1b2c0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
1b2d0 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
1b2e0 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
1b2f0 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
1b300 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
1b310 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
1b320 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
1b330 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
1b340 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
1b350 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1b360 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1b370 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
1b380 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
1b390 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
1b3a0 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
1b3b0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1b3c0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
1b3d0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
1b3e0 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
1b3f0 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
1b400 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
1b410 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
1b420 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
1b430 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
1b440 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
1b450 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
1b460 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
1b470 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
1b480 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
1b490 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
1b4a0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
1b4b0 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
1b4c0 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
1b4d0 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
1b4e0 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
1b4f0 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
1b500 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
1b510 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
1b520 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
1b530 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
1b540 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
1b550 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
1b560 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
1b570 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
1b580 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
1b590 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
1b5a0 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
1b5b0 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
1b5c0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
1b5d0 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
1b5e0 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
1b5f0 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
1b600 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
1b610 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
1b620 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
1b630 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
1b640 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
1b650 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
1b660 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
1b670 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
1b680 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
1b690 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
1b6a0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1b6b0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1b6c0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
1b6d0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
1b6e0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1b6f0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1b700 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1b710 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c  .  if( pToplevel
1b720 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
1b730 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1b740 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1b750 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
1b760 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
1b770 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79  n;  /* This only
1b780 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72   happens if ther
1b790 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72  e was a prior er
1b7a0 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c  ror */.    pTopl
1b7b0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  evel->cookieGoto
1b7c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b7d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1b7e0 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20   0, 0)+1;.  }.  
1b7f0 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
1b800 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1b810 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20  pToplevel->db;. 
1b820 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20     int mask;..  
1b830 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
1b840 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
1b850 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
1b860 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d  ].pBt!=0 || iDb=
1b870 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
1b880 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58  ( iDb<SQLITE_MAX
1b890 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
1b8a0 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
1b8b0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70 6c  ;.    if( (pTopl
1b8c0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
1b8d0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
1b8e0 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1b8f0 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
1b900 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  sk;.      pTople
1b910 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  vel->cookieValue
1b920 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
1b930 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
1b940 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
1b950 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1b960 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
1b970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b980 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1b990 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1b9a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1b9b0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b9c0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1b9d0 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
1b9e0 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
1b9f0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1ba00 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
1ba10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1ba20 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
1ba30 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
1ba40 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
1ba50 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
1ba60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
1ba70 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
1ba80 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
1ba90 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
1baa0 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
1bab0 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
1bac0 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
1bad0 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
1bae0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
1baf0 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
1bb00 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
1bb10 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
1bb20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
1bb30 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
1bb40 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
1bb50 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
1bb60 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
1bb70 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1bb80 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
1bb90 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
1bba0 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
1bbb0 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
1bbc0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
1bbd0 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
1bbe0 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1bbf0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
1bc00 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
1bc10 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
1bc20 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
1bc30 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
1bc40 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
1bc50 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
1bc60 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
1bc70 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
1bc80 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1bc90 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
1bca0 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
1bcb0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1bcc0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1bcd0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
1bce0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1bcf0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
1bd00 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
1bd10 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
1bd20 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  iDb;.  pToplevel
1bd30 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c  ->isMultiWrite |
1bd40 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a  = setStatement;.
1bd50 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 74 68  }../* .** Set th
1bd60 65 20 22 6d 61 79 20 74 68 72 6f 77 20 61 62 6f  e "may throw abo
1bd70 72 74 20 65 78 63 65 70 74 69 6f 6e 22 20 66 6c  rt exception" fl
1bd80 61 67 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  ag for the state
1bd90 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 0a  ment currently .
1bda0 2a 2a 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a  ** being coded..
1bdb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
1bdc0 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70  ayAbort(Parse *p
1bdd0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1bde0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1bdf0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1be00 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1be10 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74  plevel->mayAbort
1be20 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 1;.}../*.** C
1be30 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74  ode an OP_Halt t
1be40 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76  hat causes the v
1be50 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  dbe to return an
1be60 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
1be70 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65  NT.** error. The
1be80 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74   onError paramet
1be90 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
1bea0 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20  ich (if any) of 
1beb0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
1bec0 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20   and/or current 
1bed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1bee0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76  olled back..*/.v
1bef0 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43  oid sqlite3HaltC
1bf00 6f 6e 73 74 72 61 69 6e 74 28 50 61 72 73 65 20  onstraint(Parse 
1bf10 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
1bf20 72 72 6f 72 2c 20 63 68 61 72 20 2a 70 34 2c 20  rror, char *p4, 
1bf30 69 6e 74 20 70 34 74 79 70 65 29 7b 0a 20 20 56  int p4type){.  V
1bf40 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
1bf50 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1bf60 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  .  if( onError==
1bf70 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
1bf80 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
1bf90 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73  pParse);.  }.  s
1bfa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1bfb0 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
1bfc0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
1bfd0 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20  onError, 0, p4, 
1bfe0 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p4type);.}../*.*
1bff0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1c000 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68  f pIndex uses th
1c010 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1c020 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74  ence pColl.  Ret
1c030 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69  urn.** true if i
1c040 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65  t does and false
1c050 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
1c060 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1c070 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1c080 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61  static int colla
1c090 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20  tionMatch(const 
1c0a0 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64  char *zColl, Ind
1c0b0 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1c0c0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
1c0d0 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f  zColl!=0 );.  fo
1c0e0 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
1c0f0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
1c100 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c110 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  z = pIndex->azCo
1c120 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ll[i];.    asser
1c130 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  t( z!=0 );.    i
1c140 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
1c150 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29  ICmp(z, zColl) )
1c160 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1c170 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c180 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1c190 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1c1a0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1c1b0 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
1c1c0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1c1d0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
1c1e0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
1c1f0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
1c200 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
1c210 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1c220 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
1c230 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
1c240 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
1c250 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
1c260 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
1c270 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20  zColl){.  Index 
1c280 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
1c290 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
1c2a0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1c2b0 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72  h pTab */..  for
1c2c0 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
1c2d0 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
1c2e0 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
1c2f0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f  xt){.    if( zCo
1c300 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
1c310 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
1c320 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
1c330 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
1c340 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
1c350 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
1c360 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
1c370 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1c380 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1c390 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
1c3a0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1c3b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1c3c0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
1c3d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
1c3e0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
1c3f0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
1c400 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
1c410 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
1c420 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
1c430 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
1c440 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
1c450 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
1c460 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
1c470 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
1c480 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
1c490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1c4a0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
1c4b0 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
1c4c0 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
1c4d0 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
1c4e0 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
1c4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c500 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1c510 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1c520 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1c530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c540 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
1c550 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
1c560 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1c570 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
1c580 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1c590 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
1c5a0 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
1c5b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1c5c0 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
1c5d0 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
1c5e0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1c5f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1c600 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1c610 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62  se */..  for(iDb
1c620 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
1c630 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1c640 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
1c650 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
1c660 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
1c670 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
1c680 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
1c690 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
1c6a0 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
1c6b0 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
1c6c0 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
1c6d0 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
1c6e0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1c6f0 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
1c700 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1c710 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
1c720 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1c730 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
1c740 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
1c750 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
1c780 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
1c790 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
1c7a0 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
1c7b0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
1c7c0 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
1c7d0 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
1c7e0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
1c7f0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
1c800 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
1c810 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
1c820 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
1c830 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
1c840 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
1c850 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
1c860 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
1c870 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
1c880 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
1c890 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
1c8a0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
1c8b0 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
1c8c0 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
1c8d0 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
1c8e0 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
1c8f0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
1c900 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
1c910 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c920 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
1c930 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
1c940 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1c950 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
1c960 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
1c970 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
1c980 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
1c990 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
1c9a0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
1c9b0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
1c9c0 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
1c9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1c9e0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
1c9f0 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
1ca00 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
1ca10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ca20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1ca30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ca50 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
1ca60 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
1ca70 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1ca80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1ca90 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
1caa0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
1cab0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cad0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
1cae0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
1caf0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1cb00 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
1cb10 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1cb20 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
1cb30 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
1cb40 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1cb50 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1cb60 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
1cb70 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
1cb80 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1cb90 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
1cba0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
1cbb0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1cbc0 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
1cbd0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
1cbe0 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
1cbf0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1cc00 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1cc10 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1cc20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
1cc30 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
1cc40 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
1cc50 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
1cc60 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1cc70 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
1cc80 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
1cc90 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
1cca0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
1ccb0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1ccc0 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
1ccd0 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
1cce0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1ccf0 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
1cd00 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
1cd10 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
1cd20 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
1cd30 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
1cd40 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
1cd50 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1cd60 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
1cd70 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
1cd80 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
1cd90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1cda0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
1cdb0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1cdc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cdd0 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
1cde0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
1cdf0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
1ce00 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
1ce10 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1ce20 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
1ce30 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
1ce40 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1ce50 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1ce60 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
1ce70 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
1ce80 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
1ce90 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
1cea0 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
1ceb0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
1cec0 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
1ced0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1cee0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1cef0 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
1cf00 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1cf10 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1cf20 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
1cf30 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
1cf40 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
1cf50 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
1cf60 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1cf70 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1cf80 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1cf90 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1cfa0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1cfb0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
1cfc0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
1cfd0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1cfe0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1cff0 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
1d000 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
1d010 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
1d020 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1d030 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61  dynamicly alloca
1d040 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  ted KeyInfo stru
1d050 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62  cture that can b
1d060 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f  e used.** with O
1d070 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50  P_OpenRead or OP
1d080 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63  _OpenWrite to ac
1d090 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e  cess database in
1d0a0 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
1d0b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  If successful, a
1d0c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d0d0 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73  new structure is
1d0e0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
1d0f0 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63  is case.** the c
1d100 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1d110 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1d120 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d130 62 2c 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75  b, ) on the retu
1d140 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  rned .** pointer
1d150 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1d160 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d  curs (out of mem
1d170 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63  ory or missing c
1d180 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71  ollation .** seq
1d190 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20  uence), NULL is 
1d1a0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1d1b0 20 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65   state of pParse
1d1c0 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
1d1d0 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ect.** the error
1d1e0 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
1d1f0 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
1d200 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
1d210 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
1d220 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
1d230 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
1d240 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73  mn;.  int nBytes
1d250 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66   = sizeof(KeyInf
1d260 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  o) + (nCol-1)*si
1d270 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
1d280 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33   nCol;.  sqlite3
1d290 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d2a0 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  b;.  KeyInfo *pK
1d2b0 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29  ey = (KeyInfo *)
1d2c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1d2d0 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b  ero(db, nBytes);
1d2e0 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
1d2f0 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70      pKey->db = p
1d300 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
1d310 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Key->aSortOrder 
1d320 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e  = (u8 *)&(pKey->
1d330 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  aColl[nCol]);.  
1d340 20 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d    assert( &pKey-
1d350 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
1d360 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79  ]==&(((u8 *)pKey
1d370 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20  )[nBytes]) );.  
1d380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1d390 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
1d3a0 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
1d3b0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
1d3c0 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c      assert( zCol
1d3d0 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  l );.      pKey-
1d3e0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
1d3f0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1d400 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1d410 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
1d420 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
1d430 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1d440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
1d450 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
1d460 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  nCol;.  }..  if(
1d470 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
1d480 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d490 65 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20  ee(db, pKey);.  
1d4a0 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a    pKey = 0;.  }.
1d4b0 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
1d4c0 0a                                               .