/ Hex Artifact Content
Login

Artifact b0aee84fe34138eda3b8b4ff2fc0766714139ed3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 35 35 37 20 32 30 30 39 2f 30 37 2f 32 34  1.557 2009/07/24
02f0: 20 31 37 3a 35 38 3a 35 33 20 64 61 6e 69 65 6c   17:58:53 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  nt.h"../*.** Thi
0330: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0340: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53  led when a new S
0350: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
0360: 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20  beginning to.** 
0370: 62 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74  be parsed.  Init
0380: 69 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73  ialize the pPars
0390: 65 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e  e structure as n
03a0: 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eeded..*/.void s
03b0: 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65  qlite3BeginParse
03c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
03d0: 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29  int explainFlag)
03e0: 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  {.  pParse->expl
03f0: 61 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69  ain = (u8)explai
0400: 6e 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d  nFlag;.  pParse-
0410: 3e 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69  >nVar = 0;.}..#i
0420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0430: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
0440: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f  *.** The TableLo
0450: 63 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ck structure is 
0460: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
0470: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0480: 6b 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54  k() and.** codeT
0490: 61 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63  ableLocks() func
04a0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  tions..*/.struct
04b0: 20 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69   TableLock {.  i
04c0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
04d0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
04e0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
04f0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
0500: 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ocked */.  int i
0510: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
0520: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
0530: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
0540: 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
0550: 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20  u8 isWriteLock; 
0560: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
0570: 20 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61   write lock.  Fa
0580: 6c 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c  lse for a read l
0590: 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ock */.  const c
05a0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
05b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
05c0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
05d0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
05e0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
05f0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
0600: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
0610: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
0620: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0630: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0640: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0650: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0660: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0670: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0680: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0690: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
06a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
06b0: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
06c0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
06d0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
06e0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
06f0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
0700: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
0710: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
0720: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0730: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0740: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0750: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0760: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0770: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0780: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0790: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
07a0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
07b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
07c0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
07d0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
07f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
0800: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
0810: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
0820: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0830: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0840: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0850: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0860: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0870: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0880: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0890: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
08a0: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
08b0: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
08c0: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
08d0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
08e0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
08f0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
0900: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
0910: 3d 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  =0 );..  for(i=0
0920: 3b 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e  ; i<pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  TableLock; i++){
0940: 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65  .    p = &pTople
0950: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b  vel->aTableLock[
0960: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  i];.    if( p->i
0970: 44 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54  Db==iDb && p->iT
0980: 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20  ab==iTab ){.    
0990: 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b    p->isWriteLock
09a0: 20 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f   = (p->isWriteLo
09b0: 63 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63  ck || isWriteLoc
09c0: 6b 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  k);.      return
09d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e  ;.    }.  }..  n
09e0: 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54  Bytes = sizeof(T
09f0: 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f  ableLock) * (pTo
0a00: 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f  plevel->nTableLo
0a10: 63 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76  ck+1);.  pToplev
0a20: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d  el->aTableLock =
0a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
0a40: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54  ReallocOrFree(pT
0a50: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f  oplevel->db, pTo
0a60: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0a70: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a80: 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54  f( pToplevel->aT
0a90: 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ableLock ){.    
0aa0: 70 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e  p = &pToplevel->
0ab0: 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c  aTableLock[pTopl
0ac0: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0ad0: 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20  ++];.    p->iDb 
0ae0: 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54  = iDb;.    p->iT
0af0: 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
0b00: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20  ->isWriteLock = 
0b10: 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20  isWriteLock;.   
0b20: 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d   p->zName = zNam
0b30: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
0b40: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0b50: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70  eLock = 0;.    p
0b60: 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61  Toplevel->db->ma
0b70: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
0b80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
0b90: 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  e an OP_TableLoc
0ba0: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  k instruction fo
0bb0: 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63  r each table loc
0bc0: 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ked by the.** st
0bd0: 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75  atement (configu
0be0: 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  red by calls to 
0bf0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0c00: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ())..*/.static v
0c10: 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  oid codeTableLoc
0c20: 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ks(Parse *pParse
0c30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0c40: 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70  be *pVdbe; ..  p
0c50: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Vdbe = sqlite3Ge
0c60: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
0c70: 20 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d   assert( pVdbe!=
0c80: 30 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47  0 ); /* sqlite3G
0c90: 65 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61  etVdbe cannot fa
0ca0: 69 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79  il: VDBE already
0cb0: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20   allocated */.. 
0cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
0cd0: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20  se->nTableLock; 
0ce0: 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c  i++){.    TableL
0cf0: 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65  ock *p = &pParse
0d00: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b  ->aTableLock[i];
0d10: 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d  .    int p1 = p-
0d20: 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
0d30: 33 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62  3VdbeAddOp4(pVdb
0d40: 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c  e, OP_TableLock,
0d50: 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d   p1, p->iTab, p-
0d60: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20  >isWriteLock,.  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34      p->zName, P4
0d90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a  _STATIC);.  }.}.
0da0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
0db0: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78  codeTableLocks(x
0dc0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0dd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0de0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73  called after a s
0df0: 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  ingle SQL statem
0e00: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e10: 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42  parsed and a VDB
0e20: 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65  E program to exe
0e30: 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  cute that statem
0e40: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e50: 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20  prepared.  This 
0e60: 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65  routine puts the
0e70: 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68   finishing touch
0e80: 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42  es on the.** VDB
0e90: 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65  E program and re
0ea0: 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20  sets the pParse 
0eb0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
0ec0: 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e  e next.** parse.
0ed0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
0ee0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
0ef0: 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20  urred, it might 
0f00: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
0f10: 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65  .** no VDBE code
0f20: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a   was generated..
0f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
0f40: 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73  inishCoding(Pars
0f50: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
0f60: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
0f70: 65 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50  e *v;..  db = pP
0f80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
0f90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0fc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0fd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
0fe0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67  eturn;..  /* Beg
0ff0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1000: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1010: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
1020: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
1030: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
1040: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1050: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1060: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
1070: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1080: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1090: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
10a0: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
10b0: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
10c0: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
10e0: 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  _Halt);..    /* 
10f0: 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20  The cookie mask 
1100: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74  contains one bit
1110: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1120: 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20  se file open..  
1130: 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66    ** (Bit 0 is f
1140: 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69  or main, bit 1 i
1150: 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20  s for temp, and 
1160: 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73  so forth.)  Bits
1170: 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20   are.    ** set 
1180: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
1190: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20  e that is used. 
11a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11b0: 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a  o start a.    **
11c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
11d0: 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61  each used databa
11e0: 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79  se and to verify
11f0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1200: 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63  ie.    ** on eac
1210: 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e  h used database.
1220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1230: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1240: 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33  to>0 ){.      u3
1250: 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e  2 mask;.      in
1260: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c  t iDb;.      sql
1270: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1280: 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  (v, pParse->cook
1290: 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20  ieGoto-1);.     
12a0: 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b   for(iDb=0, mask
12b0: 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =1; iDb<db->nDb;
12c0: 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b   mask<<=1, iDb++
12d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
12e0: 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63  mask & pParse->c
12f0: 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20  ookieMask)==0 ) 
1300: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1320: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
1330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1340: 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54  dbeAddOp2(v,OP_T
1350: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c  ransaction, iDb,
1360: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
1370: 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b  >writeMask)!=0);
1380: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
1390: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
13a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
13c0: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
13d0: 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  iDb, pParse->coo
13e0: 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a  kieValue[iDb]);.
13f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1400: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1410: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1420: 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  LE.      {.     
1430: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
1450: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20  rse->nVtabLock; 
1460: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1470: 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68  char *vtab = (ch
1480: 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
1490: 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65  Table(db, pParse
14a0: 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29  ->apVtabLock[i])
14b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14d0: 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30   OP_VBegin, 0, 0
14e0: 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54  , 0, vtab, P4_VT
14f0: 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  AB);.        }. 
1500: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
1510: 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  VtabLock = 0;.  
1520: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1530: 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20      /* Once all 
1540: 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65  the cookies have
1550: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61   been verified a
1560: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nd transactions 
1570: 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a  opened, .      *
1580: 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  * obtain the req
1590: 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b  uired table-lock
15a0: 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  s. This is a no-
15b0: 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20  op unless the . 
15c0: 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63       ** shared-c
15d0: 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
15e0: 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a  enabled..      *
15f0: 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c  /.      codeTabl
1600: 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a  eLocks(pParse);.
1610: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
1620: 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43  lize any AUTOINC
1630: 52 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75  REMENT data stru
1640: 63 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e  ctures required.
1650: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1660: 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65  sqlite3Autoincre
1670: 6d 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65  mentBegin(pParse
1680: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  );..      /* Fin
1690: 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20  ally, jump back 
16a0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
16b0: 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62   of the executab
16c0: 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  le code. */.    
16d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16e0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
16f0: 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  0, pParse->cooki
1700: 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  eGoto);.    }.  
1710: 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  }...  /* Get the
1720: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
1730: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
1740: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
1750: 26 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d  & ALWAYS(pParse-
1760: 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64 62  >nErr==0) && !db
1770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1780: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1790: 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a  DEBUG.    FILE *
17a0: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
17b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
17c0: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
17d0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
17e0: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
17f0: 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20  trace);.#endif. 
1800: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1810: 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
1820: 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  0 );  /* Disable
1830: 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73  s and re-enables
1840: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a   match */.    /*
1850: 20 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e   A minimum of on
1860: 65 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e cursor is requ
1870: 69 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72  ired if autoincr
1880: 65 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20  ement is used.  
1890: 20 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20    *  See ticket 
18a0: 5b 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36  [a696379c1f08866
18b0: 5d 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61  ] */.    if( pPa
18c0: 72 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26  rse->pAinc!=0 &&
18d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30   pParse->nTab==0
18e0: 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20   ) pParse->nTab 
18f0: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
1900: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c  VdbeMakeReady(v,
1910: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70   pParse->nVar, p
1920: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a 20 20 20  Parse->nMem,.   
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
1950: 61 62 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  ab, pParse->nMax
1960: 41 72 67 2c 20 70 50 61 72 73 65 2d 3e 65 78 70  Arg, pParse->exp
1970: 6c 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lain,.          
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1990: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
19a0: 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
19b0: 61 79 41 62 6f 72 74 29 3b 0a 20 20 20 20 70 50  ayAbort);.    pP
19c0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
19d0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72  E_DONE;.    pPar
19e0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
19f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
1a00: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
1a10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1a20: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1a30: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
1a40: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1a50: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1a60: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1a70: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
1a80: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70  e->nVar = 0;.  p
1a90: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1aa0: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  k = 0;.  pParse-
1ab0: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b  >cookieGoto = 0;
1ac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1ad0: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1ae0: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1af0: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1b00: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1b10: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1b20: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
1b30: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
1b40: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
1b50: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
1b60: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1b70: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
1b80: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1b90: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1ba0: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1bb0: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1bc0: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1bd0: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1be0: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1bf0: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1c00: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
1c10: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
1c20: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
1c30: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
1c40: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
1c50: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
1c60: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
1c70: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
1c80: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
1c90: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
1ca0: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
1cb0: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
1cc0: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
1cd0: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
1ce0: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
1cf0: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
1d00: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1d10: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1d20: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
1d30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1d40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1d50: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1d60: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
1d70: 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
1d80: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
1d90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1da0: 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53  ->db;.# define S
1db0: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
1dc0: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
1dd0: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
1de0: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
1df0: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
1e00: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
1e10: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
1e20: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
1e30: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
1e40: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
1e50: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
1e60: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
1e70: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
1e80: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
1e90: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
1ea0: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1eb0: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
1ec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1ed0: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
1ee0: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1ef0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
1f00: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
1f10: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
1f20: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
1f30: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
1f40: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1f50: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
1f60: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
1f70: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
1f80: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1f90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1fa0: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1fb0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
1fc0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72  ;.  memcpy(&pPar
1fd0: 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75  se->nVar, saveBu
1fe0: 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70  f, SAVE_SZ);.  p
1ff0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b  Parse->nested--;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2010: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2020: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2030: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2040: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2050: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2060: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2070: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2080: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2090: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
20a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
20b0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
20c0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
20d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
20e0: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
20f0: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
2100: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
2110: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
2120: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
2130: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
2140: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
2150: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
2160: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
2170: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
2180: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
2190: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
21a0: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
21b0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
21c0: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
21d0: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
21e0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
21f0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2200: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
2210: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
2220: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
2230: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2240: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
2250: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
2260: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
2270: 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  i;.  int nName;.
2280: 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21    assert( zName!
2290: 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  =0 );.  nName = 
22a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
22b0: 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
22c0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
22d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
22e0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
22f0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
2300: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
2310: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
2320: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
2330: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2340: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
2350: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
2360: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
2370: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2380: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  nd(&db->aDb[j].p
2390: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
23a0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
23b0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
23c0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
23d0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
23e0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
23f0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2400: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2410: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2420: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2430: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2440: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2450: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2460: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2470: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2480: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2490: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
24a0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
24b0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
24c0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
24d0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
24e0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
24f0: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2500: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2510: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2520: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2530: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2540: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2550: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2560: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2570: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2580: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2590: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
25a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
25c0: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
25d0: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
25e0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
25f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2600: 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  e if looking for
2610: 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74   a VIEW rather t
2620: 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20  han a TABLE */. 
2630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2640: 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
2650: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
2660: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
2670: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2680: 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e  *zDbase     /* N
2690: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
26a0: 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ase.  Might be N
26b0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ULL */.){.  Tabl
26c0: 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  e *p;..  /* Read
26d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
26e0: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
26f0: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
2700: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2710: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
2720: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
2730: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
2740: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
2750: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
2760: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
2770: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2780: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
2790: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
27a0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
27b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
27c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
27d0: 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22  Msg = isView ? "
27e0: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
27f0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
2800: 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20  .    if( zDbase 
2810: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2820: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2830: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
2840: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
2850: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2860: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2870: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2880: 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61  : %s", zMsg, zNa
2890: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
28a0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
28b0: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
28c0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
28d0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
28e0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
28f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
2900: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
2910: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
2920: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
2930: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
2940: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2950: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
2960: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
2970: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2980: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
2990: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
29a0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
29b0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
29c0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
29d0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
29e0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
29f0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2a00: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
2a10: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
2a20: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2a30: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2a40: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
2a50: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
2a60: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
2a70: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
2a80: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
2a90: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
2aa0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
2ab0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
2ac0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2ad0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
2ae0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
2af0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2b00: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  ;.  int nName = 
2b10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2b20: 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
2b30: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2b40: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2b50: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
2b60: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
2b70: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
2b80: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
2b90: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
2ba0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2bb0: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
2bc0: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
2bd0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
2be0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
2bf0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
2c00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c10: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2c20: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2c30: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  xHash, zName, nN
2c40: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
2c50: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2c60: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2c70: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
2c80: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
2c90: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
2ca0: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
2cb0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
2cc0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 54 61  te3 *db = p->pTa
2cd0: 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 23 69 66 6e  ble->dbMem;.#ifn
2ce0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cf0: 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65  ANALYZE.  sqlite
2d00: 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70  3DeleteIndexSamp
2d10: 6c 65 73 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20  les(p);.#endif. 
2d20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2d30: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
2d40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d50: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
2d60: 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65   Remove the give
2d70: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  n index from the
2d80: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2d90: 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69  e, and free.** i
2da0: 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ts memory struct
2db0: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ures..**.** The 
2dc0: 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64  index is removed
2dd0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2de0: 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62  se hash tables b
2df0: 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  ut.** it is not 
2e00: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
2e10: 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20  e Table that it 
2e20: 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69  indexes..** Unli
2e30: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
2e40: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
2e50: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
2e60: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2e70: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2e80: 33 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64  3DeleteIndex(Ind
2e90: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2ea0: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2eb0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2ec0: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
2ed0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2ee0: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
2ef0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 0a  idxHash, zName,.
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f20: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2f30: 29 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  ), 0);.  assert(
2f40: 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64   pOld==0 || pOld
2f50: 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64  ==p );.  freeInd
2f60: 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ex(p);.}../*.** 
2f70: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
2f80: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
2f90: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
2fa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
2fb0: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
2fc0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
2fd0: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
2fe0: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
2ff0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
3000: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
3010: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
3020: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
3030: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
3040: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
3050: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
3060: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
3070: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
3080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
3090: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
30a0: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65  pIndex;.  int le
30b0: 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  n;.  Hash *pHash
30c0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
30d0: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
30e0: 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  h;..  len = sqli
30f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 78  te3Strlen30(zIdx
3100: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
3110: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
3120: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
3130: 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20  ame, len, 0);.  
3140: 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
3150: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3160: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3170: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3180: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3190: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
31a0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
31b0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
31c0: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
31d0: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
31e0: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
31f0: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3200: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3210: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3220: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3230: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3240: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3250: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3260: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3270: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3280: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3290: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
32a0: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
32b0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
32c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
32d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
32e0: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
32f0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
3300: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
3310: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3320: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
3330: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
3340: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
3350: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
3360: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
3370: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
3380: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
3390: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
33a0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
33b0: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
33c0: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
33d0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
33e0: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
33f0: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
3400: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
3410: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
3420: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
3430: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
3440: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
3450: 3d 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  ==0 then reset t
3460: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
3470: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
3480: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
3490: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 31 20  les.  If iDb>=1 
34a0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
34b0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
34c0: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
34d0: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
34e0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
34f0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
3500: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
3510: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
3520: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73    int i, j;.  as
3530: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
3540: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
3550: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
3560: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3570: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3580: 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  }.  for(i=iDb; i
3590: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
35a0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
35b0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
35c0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
35d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
35e0: 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42  i==1 || (pDb->pB
35f0: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
3600: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d  eHoldsMutex(pDb-
3610: 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73  >pBt)));.      s
3620: 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65  qlite3SchemaFree
3630: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
3640: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
3650: 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b>0 ) return;.  
3660: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d  }.  assert( iDb=
3670: 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  =0 );.  db->flag
3680: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3690: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
36a0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
36b0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
36c0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
36d0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
36e0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
36f0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3700: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
3710: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
3720: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
3730: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3740: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3750: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3760: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3770: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
3780: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
3790: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
37a0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
37b0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
37c0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
37d0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
37e0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
37f0: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
3800: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
3810: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3820: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3830: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3840: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3850: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3860: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3870: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
3880: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
3890: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
38a0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
38b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
38c0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
38d0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
38e0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
38f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3900: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3910: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3920: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3930: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3940: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3950: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3960: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3970: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3980: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3990: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
39a0: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
39b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
39c0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
39d0: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
39e0: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
39f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3a00: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3a10: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3a20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3a30: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3a40: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3a50: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3a60: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3a70: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3a80: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
3a90: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20  mn names from a 
3aa0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a  table or view..*
3ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3ac0: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3ad0: 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62  ames(Table *pTab
3ae0: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
3af0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
3b00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54  sqlite3 *db = pT
3b10: 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20 20 74  able->dbMem;.  t
3b20: 65 73 74 63 61 73 65 28 20 64 62 3d 3d 30 20 29  estcase( db==0 )
3b30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
3b40: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
3b50: 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61  pCol = pTable->a
3b60: 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  Col)!=0 ){.    f
3b70: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
3b80: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
3b90: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l++){.      sqli
3ba0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3bb0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
3bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3bd0: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
3be0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3bf0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3c00: 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  ol->zDflt);.    
3c10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3c20: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  db, pCol->zType)
3c30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
3c40: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
3c50: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
3c60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3c70: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  db, pTable->aCol
3c80: 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  );.  }.  pTable-
3c90: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
3ca0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d  ble->nCol = 0;.}
3cb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
3cc0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
3cd0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3ce0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
3cf0: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
3d00: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
3d10: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
3d20: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
3d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
3d40: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
3d50: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
3d60: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
3d70: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
3d80: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
3d90: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
3da0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3db0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3dc0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3dd0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3de0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3df0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3e00: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3e20: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3e30: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3e40: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3e50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
3e60: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
3e70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  0 ) return;.  db
3e80: 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d   = pTable->dbMem
3e90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 64 62  ;.  testcase( db
3ea0: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  ==0 );..  /* Do 
3eb0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
3ec0: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
3ed0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
3ee0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
3ef0: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d    pTable->nRef--
3f00: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  ;.  if( pTable->
3f10: 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65  nRef>0 ){.    re
3f20: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
3f30: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  rt( pTable->nRef
3f40: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  ==0 );..  /* Del
3f50: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
3f60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3f70: 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  this table.  */.
3f80: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
3f90: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
3fa0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
3fb0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
3fc0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3fd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
3fe0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
3ff0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b  able->pSchema );
4000: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
4010: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
4020: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4030: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4040: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4050: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4060: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4070: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44  pTable);..  /* D
4080: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
4090: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
40a0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
40b0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
40c0: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
40d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
40e0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
40f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4100: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
4110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
4120: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
4130: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
4140: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4150: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
4160: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4170: 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29   pTable->pCheck)
4180: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
4190: 65 33 56 74 61 62 43 6c 65 61 72 28 70 54 61 62  e3VtabClear(pTab
41a0: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  le);.  sqlite3Db
41b0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29  Free(db, pTable)
41c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
41d0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
41e0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
41f0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
4200: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
4210: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
4220: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
4230: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
4240: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
4250: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
4260: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4270: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4280: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
4290: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
42a0: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
42b0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
42c0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
42d0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
42e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
42f0: 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d  bName && zTabNam
4300: 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20  e[0] );.  pDb = 
4310: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
4320: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
4330: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
4340: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
4350: 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  TabName,.       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4380: 28 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20  (zTabName),0);. 
4390: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
43a0: 62 6c 65 28 70 29 3b 0a 20 20 64 62 2d 3e 66 6c  ble(p);.  db->fl
43b0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
43c0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
43d0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
43e0: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
43f0: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
4400: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
4410: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e  f that.** token.
4420: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
4430: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
4440: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
4450: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
4460: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
4470: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
4480: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
4490: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71  ion..**.** Any q
44a0: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28  uotation marks (
44b0: 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61  ex:  "name", 'na
44c0: 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20  me', [name], or 
44d0: 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20  `name`) that.** 
44e0: 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64  surround the bod
44f0: 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61  y of the token a
4500: 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a  re removed..**.*
4510: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
4520: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
4530: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
4540: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
4550: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
4560: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
4570: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
4580: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
4590: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
45a0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
45b0: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
45c0: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
45d0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
45e0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  n(sqlite3 *db, T
45f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4600: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
4610: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
4620: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
4630: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
4640: 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  ar*)pName->z, pN
4650: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
4660: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
4670: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
4680: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
4690: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
46a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
46b0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
46c0: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
46d0: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
46e0: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
46f0: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
4700: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
4710: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
4720: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
4730: 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c  rTable(Parse *p,
4740: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
4750: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
4760: 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69  tVdbe(p);.  sqli
4770: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  te3TableLock(p, 
4780: 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  iDb, MASTER_ROOT
4790: 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  , 1, SCHEMA_TABL
47a0: 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74  E(iDb));.  sqlit
47b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
47c0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
47d0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
47e0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
47f0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4800: 20 28 63 68 61 72 20 2a 29 35 2c 20 50 34 5f 49   (char *)5, P4_I
4810: 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c  NT32);  /* 5 col
4820: 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  umn table */.  i
4830: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
4840: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
4850: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
4860: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
4870: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
4880: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
4890: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
48a0: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
48b0: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
48c0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
48d0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
48e0: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
48f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
4900: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4910: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
4920: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
4930: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
4940: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
4950: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
4960: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
4970: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
4980: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4990: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
49a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
49b0: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
49c0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
49d0: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74  Db *pDb;.    int
49e0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
49f0: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
4a00: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
4a10: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
4a20: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
4a30: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
4a40: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
4a50: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
4a60: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4a70: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
4a80: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
4a90: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
4aa0: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
4ab0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4ad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
4ae0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
4af0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
4b00: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
4b10: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
4b20: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
4b30: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
4b40: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
4b50: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
4b60: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
4b70: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
4b80: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
4b90: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
4ba0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
4bb0: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
4bc0: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
4bd0: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
4be0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
4bf0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c20: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
4c30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
4c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4c60: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
4c70: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
4c80: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
4c90: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
4ca0: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
4cb0: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
4cc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
4cd0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
4ce0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
4cf0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
4d00: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
4d10: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
4d20: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
4d30: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
4d40: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
4d50: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
4d60: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
4d70: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
4d80: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
4d90: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
4da0: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
4db0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4dc0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
4dd0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
4de0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
4df0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
4e00: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
4e10: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
4e20: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
4e30: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
4e40: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
4e50: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
4e60: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
4e70: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
4e80: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
4e90: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
4ea0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
4eb0: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
4ec0: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
4ed0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
4ee0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
4ef0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
4f00: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
4f10: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
4f20: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
4f30: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
4f40: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4f50: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
4f60: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
4f70: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
4f80: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4f90: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
4fa0: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
4fb0: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
4fc0: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
4fd0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
4fe0: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
4ff0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
5000: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
5010: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
5020: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
5030: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
5040: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
5050: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
5060: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5070: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
5080: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
5090: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
50a0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57  ->db;..  if( ALW
50b0: 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26  AYS(pName2!=0) &
50c0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
50d0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
50e0: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
50f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5100: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
5110: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
5120: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5130: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5140: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
5150: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
5160: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
5170: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
5180: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
5190: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
51a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
51b0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
51c0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
51d0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
51e0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
51f0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5200: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5210: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
5220: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
5230: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
5240: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
5250: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
5260: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
5270: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
5280: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5290: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
52a0: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
52b0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
52c0: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
52d0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
52e0: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
52f0: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
5300: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
5310: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
5320: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
5330: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
5340: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
5350: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
5360: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
5370: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
5380: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
5390: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
53a0: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
53b0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
53c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
53d0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
53e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
53f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5400: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
5410: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
5420: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
5430: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
5440: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
5450: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
5460: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
5470: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
5480: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
5490: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
54a0: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
54b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
54c0: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
54d0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
54e0: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
54f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
5500: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
5510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5520: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5530: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
5540: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
5550: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5560: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
5570: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
5580: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
5590: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
55a0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
55b0: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
55c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
55d0: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
55e0: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
55f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
5600: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
5610: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
5620: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
5630: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
5640: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
5650: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
5660: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
5670: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
5680: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
5690: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
56a0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
56b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
56c0: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
56d0: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
56e0: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
56f0: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
5700: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
5710: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
5720: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
5730: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
5740: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
5750: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
5760: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5770: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
5780: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
5790: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
57a0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
57b0: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
57c0: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
57d0: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
57e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
57f0: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
5800: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
5810: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
5820: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
5830: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
5840: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
5850: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
5860: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
5870: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
5880: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
5890: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
58a0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
58b0: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
58c0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
58d0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
58e0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
58f0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
5900: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5910: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5920: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
5930: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
5940: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
5950: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
5960: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
5970: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
5980: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
5990: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
59a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
59b0: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
59c0: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
59d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
59e0: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
59f0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
5a00: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
5a10: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
5a20: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
5a30: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
5a40: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
5a50: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
5a60: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
5a70: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
5a80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5a90: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
5aa0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
5ab0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5ac0: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
5ad0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
5ae0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5af0: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
5b00: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
5b10: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
5b20: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
5b30: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
5b40: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
5b50: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5b60: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
5b70: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
5b80: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5b90: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5ba0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5bb0: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
5bc0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5bd0: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5be0: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
5bf0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5c00: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5c10: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5c20: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
5c30: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
5c40: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5c50: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5c60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
5c70: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5c80: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
5c90: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5ca0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
5cb0: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
5cc0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
5cd0: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
5ce0: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
5cf0: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
5d00: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
5d10: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
5d20: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
5d30: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
5d40: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
5d50: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
5d60: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5d70: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
5d80: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5d90: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
5da0: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
5db0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
5dc0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
5dd0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
5de0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
5df0: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
5e00: 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  ;.  if( !OMIT_TE
5e10: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
5e20: 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f  & iDb>1 ){.    /
5e30: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
5e40: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
5e50: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
5e60: 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20  qualified */.   
5e70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5e80: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
5e90: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
5ea0: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
5eb0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
5ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49  ;.  }.  if( !OMI
5ed0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5ee0: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
5ef0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
5f00: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
5f10: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5f20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5f30: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
5f40: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
5f50: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
5f60: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
5f70: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
5f80: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
5f90: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5fa0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
5fb0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
5fc0: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
5fd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5fe0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
5ff0: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
6000: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
6010: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
6020: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
6030: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6040: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
6050: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
6060: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
6070: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
6080: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
6090: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
60a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
60b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
60c0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
60d0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
60e0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
60f0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
6100: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6110: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
6120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6130: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6140: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
6150: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
6160: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
6170: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6180: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
6190: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
61a0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
61b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
61c0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
61d0: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
61e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
61f0: 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26  if( !isVirtual &
6200: 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  & sqlite3AuthChe
6210: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
6220: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
6230: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6240: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6250: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6260: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
6270: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
6280: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
6290: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
62a0: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
62b0: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
62c0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
62d0: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
62e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
62f0: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54  .  ** it does. T
6300: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
6310: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
6320: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61   being parsed wa
6330: 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f  s passed.  ** to
6340: 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c   an sqlite3_decl
6350: 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e  are_vtab() call.
6360: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   In that case on
6370: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
6380: 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70  mes.  ** and typ
6390: 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  es will be used,
63a0: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
63b0: 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  need to test for
63c0: 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20   namespace.  ** 
63d0: 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f  collisions..  */
63e0: 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41  .  if( !IN_DECLA
63f0: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69  RE_VTAB ){.    i
6400: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
6410: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
6420: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
6430: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6440: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6450: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
6460: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
6470: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
6480: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  iDb].zName);.   
6490: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
64a0: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
64b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
64c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
64d0: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
64e0: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
64f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
6500: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6510: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6520: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
6530: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
6540: 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28  Name, 0)!=0 && (
6550: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
6560: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
6570: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6580: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
6590: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
65a0: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
65b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
65c0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
65d0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
65e0: 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ..  pTable = sql
65f0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
6600: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
6610: 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  e));.  if( pTabl
6620: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  e==0 ){.    db->
6630: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
6640: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
6650: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6660: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
6670: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
6680: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6690: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
66a0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
66b0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
66c0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
66d0: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
66e0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
66f0: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31  pTable->nRef = 1
6700: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65  ;.  pTable->dbMe
6710: 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  m = 0;.  assert(
6720: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6730: 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  le==0 );.  pPars
6740: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
6750: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Table;..  /* If 
6760: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69  this is the magi
6770: 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  c sqlite_sequenc
6780: 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  e table used by 
6790: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20  autoincrement,. 
67a0: 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20   ** then record 
67b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
67c0: 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  s table in the m
67d0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
67e0: 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74  ucture.  ** so t
67f0: 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66  hat INSERT can f
6800: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61  ind the table ea
6810: 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  sily..  */.#ifnd
6820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
6830: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69  UTOINCREMENT.  i
6840: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  f( !pParse->nest
6850: 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61  ed && strcmp(zNa
6860: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  me, "sqlite_sequ
6870: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
6880: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
6890: 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ->pSeqTab = pTab
68a0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
68b0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
68c0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
68d0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
68e0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
68f0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
6900: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
6910: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
6920: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
6930: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
6940: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
6950: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
6960: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
6970: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
6980: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
6990: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
69a0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
69b0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
69c0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
69d0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
69e0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
69f0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
6a00: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
6a10: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
6a20: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
6a30: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
6a40: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
6a50: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
6a60: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
6a70: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
6a80: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
6a90: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
6aa0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
6ab0: 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69  t j1;.    int fi
6ac0: 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e  leFormat;.    in
6ad0: 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65  t reg1, reg2, re
6ae0: 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  g3;.    sqlite3B
6af0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
6b00: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
6b10: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
6b20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6b30: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73  TABLE.    if( is
6b40: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
6b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b60: 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
6b70: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
6b80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
6b90: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
6ba0: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
6bb0: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
6bc0: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
6bd0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
6be0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20      */.    reg1 
6bf0: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  = pParse->regRow
6c00: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
6c10: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20  Mem;.    reg2 = 
6c20: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20  pParse->regRoot 
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 72 65 67 33 20 3d 20 2b 2b 70  ;.    reg3 = ++p
6c50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c70: 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
6c80: 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20  kie, iDb, reg3, 
6c90: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
6ca0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
6cb0: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
6cc0: 69 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73  iDb);.    j1 = s
6cd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6ce0: 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29  (v, OP_If, reg3)
6cf0: 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74  ;.    fileFormat
6d00: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
6d10: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
6d20: 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20  eFmt)!=0 ?.     
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a               1 :
6d40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45   SQLITE_MAX_FILE
6d50: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
6d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6d70: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69  , OP_Integer, fi
6d80: 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b  leFormat, reg3);
6d90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6da0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
6db0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
6dc0: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
6dd0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6de0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6df0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28  OP_Integer, ENC(
6e00: 64 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  db), reg3);.    
6e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e20: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
6e30: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
6e40: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67  XT_ENCODING, reg
6e50: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6e60: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
6e70: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
6e80: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
6e90: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
6ea0: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
6eb0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
6ec0: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
6ed0: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
6ee0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
6ef0: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
6f00: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
6f10: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
6f20: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
6f30: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
6f40: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
6f50: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
6f60: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
6f70: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
6f80: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
6f90: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
6fa0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
6fb0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
6fc0: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
6fd0: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
6fe0: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
6ff0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
7000: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7010: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
7020: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
7030: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
7040: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
7050: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
7060: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
7070: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
7080: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7090: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
70a0: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
70b0: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
70c0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
70d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
70e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
70f0: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
7100: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
7110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7120: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
7130: 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65  teTable, iDb, re
7140: 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g2);.    }.    s
7150: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
7160: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
7170: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
7180: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7190: 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  NewRowid, 0, reg
71a0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
71b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
71c0: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a  Null, 0, reg3);.
71d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
71e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
71f0: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
7200: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
7210: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
7220: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
7230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7240: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
7250: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
7260: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
7270: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
7280: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
7290: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
72a0: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
72b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
72c0: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
72d0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
72e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
72f0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
7300: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
7310: 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  wo strings in a 
7320: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
7330: 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69   manner..** It i
7340: 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  s slightly faste
7350: 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73  r than calling s
7360: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20  qlite3StrICmp() 
7370: 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a  directly, but.**
7380: 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72   produces larger
7390: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52   code..**.** WAR
73a0: 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f  NING: This macro
73b0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
73c0: 6c 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63  le with the strc
73d0: 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a  mp() family. It.
73e0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  ** returns true 
73f0: 69 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e  if the two strin
7400: 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74  gs are equal, ot
7410: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
7420: 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d  /.#define STRICM
7430: 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74  P(x, y) (\.sqlit
7440: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
7450: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
7460: 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69  )(x)]==   \.sqli
7470: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
7480: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  *(unsigned char 
7490: 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20  *)(y)]     \.&& 
74a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28  sqlite3StrICmp((
74b0: 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29  x)+1,(y)+1)==0 )
74c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
74d0: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
74e0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
74f0: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
7500: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
7510: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
7520: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
7530: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
7540: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
7550: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7560: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
7570: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
7580: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
7590: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
75a0: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
75b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
75c0: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
75d0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
75e0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
75f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7600: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
7610: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
7620: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
7630: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
7640: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7650: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
7660: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
7670: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
7680: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
7690: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
76a0: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
76b0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
76c0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
76d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
76e0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
76f0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
7700: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
7710: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7720: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
7730: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
7740: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
7750: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
7760: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
7770: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
7780: 20 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a     if( STRICMP(z
7790: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
77a0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
77b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
77c0: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
77d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
77e0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
77f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
7800: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
7820: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
7830: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
7840: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
7850: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
7860: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
7870: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
7880: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
7890: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
78a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
78b0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
78c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
78d0: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
78e0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
78f0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
7900: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
7910: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
7920: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7930: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
7940: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
7950: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
7960: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
7970: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
7980: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
7990: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
79a0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
79b0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
79c0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
79d0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
79e0: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
79f0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
7a00: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
7a10: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7a20: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7a30: 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  E;.  p->nCol++;.
7a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7a50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7a60: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
7a70: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
7a80: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
7a90: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
7aa0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
7ab0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
7ac0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
7ad0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
7ae0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
7af0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
7b00: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
7b10: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
7b20: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
7b30: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
7b40: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
7b50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
7b60: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
7b70: 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61  le *p;.  p = pPa
7b80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
7b90: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
7ba0: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
7bb0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43   return;.  p->aC
7bc0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f  ol[p->nCol-1].no
7bd0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
7be0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
7bf0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
7c00: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
7c10: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
7c20: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
7c30: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
7c40: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
7c50: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
7c60: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
7c70: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
7c80: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
7c90: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7ca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
7cb0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
7cc0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
7cd0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
7ce0: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
7cf0: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
7d00: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
7d10: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
7d20: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
7d30: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
7d40: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
7d50: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
7d60: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
7d70: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
7d80: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
7d90: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
7da0: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
7db0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
7dc0: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
7dd0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
7e00: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
7e10: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
7e20: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
7e30: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7e40: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
7e50: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7e60: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
7e70: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7e80: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
7e90: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7ea0: 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52  E_AFF_NONE.** 'R
7eb0: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
7ec0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7ed0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
7ee0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7ef0: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
7f00: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7f10: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
7f20: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7f30: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
7f40: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
7f50: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
7f60: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
7f70: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
7f80: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
7f90: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
7fa0: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
7fb0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
7fc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
7fd0: 0a 0a 20 20 69 66 28 20 7a 49 6e 20 29 20 77 68  ..  if( zIn ) wh
7fe0: 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20  ile( zIn[0] ){. 
7ff0: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
8000: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
8010: 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d  wer[(*zIn)&0xff]
8020: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
8030: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
8040: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
8050: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
8060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
8070: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
8080: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8090: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ; .    }else if(
80a0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
80b0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
80c0: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
80d0: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
80e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
80f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
8100: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
8110: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
8120: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
8130: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
8140: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8150: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
8160: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8170: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
8180: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
81a0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
81b0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
81c0: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
81d0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
81e0: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
81f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
8200: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
8210: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
8220: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
8230: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
8240: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
8250: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
8260: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
8270: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
8280: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8290: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
82a0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
82b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
82c0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
82d0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
82e0: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
82f0: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
8300: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8310: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8320: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8330: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
8340: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
8350: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
8360: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
8370: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
8380: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
8390: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
83a0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
83b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
83c0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
83d0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
83e0: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
83f0: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
8400: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
8410: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
8420: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8430: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
8440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
8450: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
8460: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8470: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
8480: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
8490: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
84a0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
84b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
84c0: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
84d0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
84e0: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
84f0: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
8500: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
8510: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
8520: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
8530: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
8540: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
8550: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
8560: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
8570: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
8580: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
8590: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
85a0: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
85b0: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
85c0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
85d0: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
85e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
85f0: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
8600: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
8610: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
8620: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
8630: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
8640: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20  olumn *pCol;..  
8650: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8660: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
8670: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
8680: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
8690: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
86a0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20  l[p->nCol-1];.  
86b0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54  assert( pCol->zT
86c0: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ype==0 );.  pCol
86d0: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
86e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
86f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79 70 65  Parse->db, pType
8700: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  );.  pCol->affin
8710: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66  ity = sqlite3Aff
8720: 69 6e 69 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e  inityType(pCol->
8730: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
8740: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8750: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
8760: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
8770: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8780: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
8790: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
87a0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
87b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
87c0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
87d0: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
87e0: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
87f0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
8800: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
8810: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
8820: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8830: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8840: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8850: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8860: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8870: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8890: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
88a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
88b0: 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20  rSpan *pSpan){. 
88c0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
88d0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
88e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
88f0: 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61  e->db;.  p = pPa
8900: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8910: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
8920: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
8930: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
8940: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
8950: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
8960: 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e  Function(pSpan->
8970: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
8980: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8990: 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74  pParse, "default
89a0: 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e   value of column
89b0: 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e   [%s] is not con
89c0: 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20  stant",.        
89d0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a    pCol->zName);.
89e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
89f0: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45   /* A copy of pE
8a00: 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74  xpr is used inst
8a10: 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ead of the origi
8a20: 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f  nal, as pExpr co
8a30: 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
8a40: 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e  tokens that poin
8a50: 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65  t to volatile me
8a60: 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27  mory. The 'span'
8a70: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
8a80: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72  on.      ** is r
8a90: 65 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d  equired by pragm
8aa0: 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20  a table_info..  
8ab0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
8ac0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8ad0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
8ae0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66  .      pCol->pDf
8af0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
8b00: 44 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  Dup(db, pSpan->p
8b10: 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45  Expr, EXPRDUP_RE
8b20: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
8b30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8b40: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
8b50: 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d     pCol->zDflt =
8b60: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8b70: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
8b80: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
8bc0: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
8bd0: 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rt));.    }.  }.
8be0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8bf0: 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  ete(db, pSpan->p
8c00: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
8c10: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
8c20: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
8c30: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
8c40: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
8c50: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
8c60: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
8c70: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
8c80: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
8c90: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
8ca0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8cb0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
8cc0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
8cd0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
8ce0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
8cf0: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
8d00: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
8d10: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
8d20: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
8d30: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
8d40: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
8d50: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
8d60: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
8d70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
8d80: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
8d90: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
8da0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
8db0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
8dc0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
8dd0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
8de0: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
8df0: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
8e00: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
8e10: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
8e20: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
8e30: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
8e40: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
8e50: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
8e60: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
8e70: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
8e80: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
8e90: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8ea0: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
8eb0: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
8ec0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8ed0: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
8ee0: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
8ef0: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
8f00: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
8f10: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
8f20: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
8f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8f40: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
8f50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8f60: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8f70: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
8f80: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
8f90: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
8fa0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
8fb0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
8fc0: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
8fd0: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
8fe0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
8ff0: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
9000: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
9010: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
9020: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
9030: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
9040: 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a  sortOrder     /*
9050: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f   SQLITE_SO_ASC o
9060: 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  r SQLITE_SO_DESC
9070: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
9080: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
9090: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
90a0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
90b0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
90c0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c  .  if( pTab==0 |
90d0: 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
90e0: 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  B ) goto primary
90f0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
9100: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9110: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
9120: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
9130: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9140: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
9150: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
9160: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
9170: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
9180: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
9190: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
91a0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
91b0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
91c0: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
91d0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
91e0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
91f0: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d  l - 1;.    pTab-
9200: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
9210: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  imKey = 1;.  }el
9220: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
9230: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
9240: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
9250: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
9260: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
9270: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
9280: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
9290: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
92a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
92b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
92c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
92d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
92e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
92f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
9300: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
9310: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
9320: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
9330: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
9340: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
9350: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
9360: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
9370: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
9380: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
9390: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
93a0: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
93b0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
93c0: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
93d0: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
93e0: 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72      && sortOrder
93f0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
9400: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
9410: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
9420: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
9430: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
9440: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
9450: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
9460: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
9470: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
9480: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
9490: 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nt;.  }else if( 
94a0: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
94b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
94c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
94d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
94e0: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
94f0: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
9500: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
9510: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
9520: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
9530: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9540: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
9550: 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61   p = sqlite3Crea
9560: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
9570: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
9580: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73  onError, 0, 0, s
9590: 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20  ortOrder, 0);.  
95a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
95b0: 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20   p->autoIndex = 
95c0: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  2;.    }.    pLi
95d0: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
95e0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
95f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9600: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9610: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
9620: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
9630: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
9640: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
9650: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
9660: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9670: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
9680: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
9690: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
96a0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
96b0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
96c0: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
96d0: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
96e0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
96f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9700: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
9710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9720: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
9730: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
9740: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
9750: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
9760: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
9770: 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d    pTab->pCheck =
9780: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
9790: 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  db, pTab->pCheck
97a0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
97b0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
97c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
97d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65  rDelete(db, pChe
97e0: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
97f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
9800: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
9810: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
9820: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
9830: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
9840: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
9850: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9860: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
9870: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9880: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
9890: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
98a0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
98b0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
98c0: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
98d0: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
98e0: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
98f0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
9900: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
9910: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
9920: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
9930: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
9940: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
9950: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
9960: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
9970: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
9980: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
9990: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
99a0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
99b0: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
99c0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
99d0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
99e0: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
99f0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
9a00: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
9a10: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
9a20: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
9a30: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
9a40: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
9a50: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
9a60: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
9a70: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
9a80: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
9a90: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
9aa0: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
9ab0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
9ac0: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
9ad0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
9ae0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9af0: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
9b00: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
9b10: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
9b20: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
9b30: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
9b40: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
9b50: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
9b60: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
9b70: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
9b80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9b90: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a   zColl);.  }.}..
9ba0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9bb0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
9bc0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9bd0: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
9be0: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
9bf0: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
9c00: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
9c10: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
9c20: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
9c30: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
9c40: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9c50: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
9c60: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
9c70: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
9c80: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
9c90: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
9ca0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
9cb0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
9cc0: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
9cd0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9ce0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
9cf0: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
9d00: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
9d10: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
9d20: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
9d30: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
9d40: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
9d50: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
9d60: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
9d70: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
9d80: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9d90: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
9da0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
9db0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
9dc0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
9dd0: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
9de0: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
9df0: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
9e00: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
9e10: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
9e20: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
9e30: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
9e40: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
9e50: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
9e60: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9e70: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
9e80: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
9e90: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
9ea0: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
9eb0: 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
9ec0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
9ed0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20  3FindCollSeq(), 
9ee0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
9ef0: 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  q().*/.CollSeq *
9f00: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9f10: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
9f20: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9f30: 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
9f40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9f50: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
9f60: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
9f70: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
9f80: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
9f90: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
9fa0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
9fb0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
9fc0: 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  zName, initbusy)
9fd0: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
9fe0: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
9ff0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
a000: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
a010: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64  ite3GetCollSeq(d
a020: 62 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a  b, enc, pColl, z
a030: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
a040: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  pColl ){.      s
a050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a060: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
a070: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
a080: 63 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  ce: %s", zName);
a090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
a0a0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
a0b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
a0c0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
a0d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
a0e0: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
a0f0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
a100: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
a110: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
a120: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
a130: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
a140: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
a150: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
a160: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
a170: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
a180: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
a190: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
a1a0: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
a1b0: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
a1c0: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
a1d0: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
a1e0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
a1f0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
a200: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
a210: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
a220: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
a230: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
a240: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
a250: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
a260: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
a270: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
a280: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
a290: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
a2a0: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
a2b0: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
a2c0: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
a2d0: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
a2e0: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
a2f0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
a300: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
a310: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
a320: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
a330: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
a340: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
a350: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
a360: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
a370: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
a380: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
a390: 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20  ngeCookie(Parse 
a3a0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
a3b0: 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  ){.  int r1 = sq
a3c0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
a3d0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
a3e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a3f0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
a400: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a420: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
a430: 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  r, db->aDb[iDb].
a440: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
a450: 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20  cookie+1, r1);. 
a460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a470: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
a480: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53  ie, iDb, BTREE_S
a490: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72  CHEMA_VERSION, r
a4a0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
a4b0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
a4c0: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
a4d0: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
a4e0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
a4f0: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
a500: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
a510: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
a520: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
a530: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
a540: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
a550: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
a560: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
a570: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
a580: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
a590: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
a5a0: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
a5b0: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
a5c0: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
a5d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
a5e0: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
a5f0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
a600: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
a610: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
a620: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
a630: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
a640: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
a650: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
a660: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
a670: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
a680: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
a690: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
a6a0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
a6b0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
a6c0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
a6d0: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
a6e0: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
a6f0: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
a700: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
a710: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
a720: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
a730: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
a740: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
a750: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
a760: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
a770: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
a780: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
a790: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
a7a0: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
a7b0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
a7c0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
a7d0: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
a7e0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
a7f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
a800: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
a810: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
a820: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
a830: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
a840: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
a850: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
a860: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
a870: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
a880: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
a890: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
a8a0: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
a8b0: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
a8c0: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
a8d0: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
a8e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
a8f0: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
a900: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
a910: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
a920: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
a930: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
a940: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
a950: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
a960: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
a970: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
a980: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
a990: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
a9a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
a9b0: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
a9c0: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
a9d0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
a9e0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
a9f0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
aa00: 65 6e 74 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74  ent[0]) || sqlit
aa10: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
aa20: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b  dent, j)!=TK_ID;
aa30: 0a 20 20 69 66 28 20 21 6e 65 65 64 51 75 6f 74  .  if( !needQuot
aa40: 65 20 29 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f  e ){.    needQuo
aa50: 74 65 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  te = zIdent[j];.
aa60: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 65 65 64 51    }..  if( needQ
aa70: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
aa80: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
aa90: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
aaa0: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
aab0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
aac0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
aad0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
aae0: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
aaf0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
ab00: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
ab10: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
ab20: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
ab30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
ab40: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
ab50: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
ab60: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
ab70: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
ab80: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
ab90: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
aba0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
abb0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
abc0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
abd0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
abe0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
abf0: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
ac00: 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
ac10: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e   Table *p){.  in
ac20: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
ac30: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
ac40: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
ac50: 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20  *zEnd;.  Column 
ac60: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
ac70: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
ac80: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
ac90: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
aca0: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
acb0: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
acc0: 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20  Name) + 5;.  }. 
acd0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
ace0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
acf0: 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20  f( n<50 ){ .    
ad00: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
ad10: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
ad20: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
ad30: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
ad40: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
ad50: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
ad60: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
ad70: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
ad80: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
ad90: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
ada0: 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  c( n );.  if( zS
adb0: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  tmt==0 ){.    db
adc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
add0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
ade0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
adf0: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
ae00: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
ae10: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74   ");.  k = sqlit
ae20: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74  e3Strlen30(zStmt
ae30: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
ae40: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
ae50: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
ae60: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
ae70: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
ae80: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
ae90: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
aea0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
aeb0: 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d  * const azType[]
aec0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
aed0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
aee0: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
aef0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
af00: 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20  _AFF_NONE    */ 
af10: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
af20: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
af30: 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20  C */ " NUM",.   
af40: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
af50: 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20  FF_INTEGER */ " 
af60: 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  INT",.        /*
af70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
af80: 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20      */ " REAL". 
af90: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65     };.    int le
afa0: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
afb0: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73  r *zType;..    s
afc0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
afd0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
afe0: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
aff0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b000: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
b010: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
b020: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
b030: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
b040: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
b050: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
b060: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e  QLITE_AFF_TEXT >
b070: 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  = 0 );.    asser
b080: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
b090: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
b0a0: 54 20 3c 20 73 69 7a 65 6f 66 28 61 7a 54 79 70  T < sizeof(azTyp
b0b0: 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70 65  e)/sizeof(azType
b0c0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 74 65 73 74  [0]) );.    test
b0d0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
b0e0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
b0f0: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
b100: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b110: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b120: 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65  F_NONE );.    te
b130: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
b140: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
b150: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
b160: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
b170: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
b180: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
b190: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b1a0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b1b0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
b1c0: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
b1d0: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
b1e0: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
b1f0: 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20  TE_AFF_TEXT];.  
b200: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
b210: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
b220: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
b230: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
b240: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20  TE_AFF_NONE .   
b250: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
b260: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
b270: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
b280: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65  zType) );.    me
b290: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
b2a0: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
b2b0: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
b2c0: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
b2d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
b2e0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
b2f0: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
b300: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
b310: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
b320: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b330: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
b340: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
b350: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
b360: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b370: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
b380: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
b390: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
b3a0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
b3b0: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
b3c0: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
b3d0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
b3e0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
b3f0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
b400: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
b410: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
b420: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
b430: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
b440: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
b450: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
b460: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
b470: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
b480: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
b490: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
b4a0: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
b4b0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
b4c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
b4d0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
b4e0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
b4f0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
b500: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
b510: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
b520: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
b530: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
b540: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
b550: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
b560: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
b570: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b580: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
b590: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
b5a0: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
b5b0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
b5c0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
b5d0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
b5e0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
b5f0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
b600: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
b610: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
b620: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
b630: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
b640: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
b650: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
b660: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
b670: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
b680: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
b690: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
b6a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
b6b0: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
b6c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b6d0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
b6e0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
b6f0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
b700: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
b710: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
b720: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
b730: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
b740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b750: 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65  e final ')' toke
b760: 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  n in the CREATE 
b770: 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63  TABLE */.  Selec
b780: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
b790: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
b7a0: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
b7b0: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
b7c0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
b7d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b7e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
b7f0: 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  Db;..  if( (pEnd
b800: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
b810: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
b820: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
b830: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  turn;.  }.  p = 
b840: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b850: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
b860: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
b870: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
b880: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
b890: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
b8a0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
b8b0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
b8c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b8d0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
b8e0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
b8f0: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
b900: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
b910: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
b920: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53  >pCheck ){.    S
b930: 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20  rcList sSrc;    
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b950: 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66  * Fake SrcList f
b960: 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  or pParse->pNewT
b970: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  able */.    Name
b980: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
b990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b9a0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
b9b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b9c0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74  e */..    memset
b9d0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
b9e0: 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73  (sNC));.    mems
b9f0: 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a  et(&sSrc, 0, siz
ba00: 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20  eof(sSrc));.    
ba10: 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20  sSrc.nSrc = 1;. 
ba20: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61     sSrc.a[0].zNa
ba30: 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20  me = p->zName;. 
ba40: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61     sSrc.a[0].pTa
ba50: 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e  b = p;.    sSrc.
ba60: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[0].iCursor = -
ba70: 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  1;.    sNC.pPars
ba80: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
ba90: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26  sNC.pSrcList = &
baa0: 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73  sSrc;.    sNC.is
bab0: 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69  Check = 1;.    i
bac0: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
bad0: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
bae0: 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20   p->pCheck) ){. 
baf0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
bb00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
bb10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bb20: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
bb30: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
bb40: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
bb50: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
bb60: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
bb70: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
bb80: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
bb90: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
bba0: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
bbb0: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
bbc0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
bbd0: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
bbe0: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
bbf0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
bc00: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
bc10: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
bc20: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
bc30: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
bc40: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
bc50: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
bc60: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
bc70: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
bc80: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ).  */.  if( db-
bc90: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
bca0: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
bcb0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
bcc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
bcd0: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
bce0: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
bcf0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
bd00: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
bd10: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
bd20: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
bd30: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
bd40: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
bd50: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
bd60: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
bd70: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
bd80: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
bd90: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
bda0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
bdb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
bdc0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
bdd0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
bde0: 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
bdf0: 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
be00: 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
be10: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
be20: 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
be30: 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
be40: 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
be50: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
be60: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
be70: 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
be80: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
be90: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
bea0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
beb0: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
bec0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
bed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bee0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
bef0: 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
bf00: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
bf10: 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
bf20: 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
bf30: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
bf40: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
bf50: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
bf60: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
bf70: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
bf80: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
bf90: 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
bfa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
bfb0: 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
bfc0: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
bfd0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
bfe0: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
bff0: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
c000: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
c010: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
c020: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
c030: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
c040: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
c050: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
c060: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
c070: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
c080: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
c090: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
c0a0: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
c0b0: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
c0c0: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
c0d0: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
c0e0: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
c0f0: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
c100: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
c110: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
c120: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
c130: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
c140: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
c150: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
c160: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
c170: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
c180: 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
c190: 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
c1a0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
c1b0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
c1c0: 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
c1d0: 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
c1e0: 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
c1f0: 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
c200: 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
c210: 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
c220: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
c230: 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
c240: 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
c250: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
c260: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
c270: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
c280: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
c290: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
c2a0: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
c2b0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
c2c0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
c2d0: 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b  Parse->nTab==1);
c2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c2f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
c300: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
c310: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
c320: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
c330: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
c340: 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   1);.      pPars
c350: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
c360: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c370: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
c380: 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20  SRT_Table, 1);. 
c390: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
c3a0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
c3b0: 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ct, &dest);.    
c3c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c3d0: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
c3e0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
c3f0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
c400: 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  {.        pSelTa
c410: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
c420: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
c430: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
c440: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
c450: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
c460: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c470: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
c480: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
c490: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
c4a0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
c4b0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
c4c0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
c4d0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
c4e0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
c4f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
c500: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
c510: 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20  (pSelTab);.     
c520: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
c530: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
c540: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
c550: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
c560: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
c570: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
c580: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
c590: 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
c5a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c5b0: 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e  n = (int)(pEnd->
c5c0: 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
c5d0: 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20  eToken.z) + 1;. 
c5e0: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
c5f0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c600: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
c610: 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79  TE %s %.*s", zTy
c620: 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e  pe2, n, pParse->
c630: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20  sNameToken.z.   
c640: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
c650: 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74   /* A slot for t
c660: 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c  he record has al
c670: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
c680: 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20  ated in the .   
c690: 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   ** SQLITE_MASTE
c6a0: 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73  R table.  We jus
c6b0: 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65  t need to update
c6c0: 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20   that slot with 
c6d0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  all.    ** the i
c6e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65  nformation we've
c6f0: 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20   collected..    
c700: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
c710: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
c720: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
c730: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
c740: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
c750: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
c760: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
c770: 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  #%d, sql=%Q ".  
c780: 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
c790: 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62  d=#%d",.      db
c7a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
c7b0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
c7c0: 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65  Db),.      zType
c7d0: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
c7e0: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
c7f0: 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
c800: 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a  regRoot,.      z
c810: 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72  Stmt,.      pPar
c820: 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20  se->regRowid.   
c830: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
c840: 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
c850: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
c860: 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
c870: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
c880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c890: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
c8a0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
c8b0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  f we need to cre
c8c0: 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65  ate an sqlite_se
c8d0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72  quence table for
c8e0: 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20  .    ** keeping 
c8f0: 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63  track of autoinc
c900: 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20  rement keys..   
c910: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74   */.    if( p->t
c920: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
c930: 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
c940: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
c950: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
c960: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
c970: 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  ema->pSeqTab==0 
c980: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c990: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
c9a0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
c9b0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
c9c0: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
c9d0: 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
c9e0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
c9f0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
ca00: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
ca10: 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
ca20: 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
ca30: 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
ca40: 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
ca50: 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
ca60: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
ca70: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
ca80: 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  iDb, 0, 0,.     
ca90: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
caa0: 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
cab0: 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c  '%q'",p->zName),
cac0: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
cad0: 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
cae0: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
caf0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
cb00: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
cb10: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
cb20: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
cb30: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
cb40: 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20  Old;.    Schema 
cb50: 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53  *pSchema = p->pS
cb60: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20  chema;.    pOld 
cb70: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
cb80: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
cb90: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
cba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
cbc0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
cbd0: 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20  >zName),p);.    
cbe0: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
cbf0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
cc00: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
cc10: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
cc20: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
cc30: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
cc40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
cc50: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
cc60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
cc70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
cc80: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
cc90: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
cca0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
ccb0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
ccc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ccd0: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
cce0: 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
ccf0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
cd00: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
cd10: 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
cd20: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
cd30: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
cd40: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cd50: 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
cd60: 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
cd70: 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
cd80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
cd90: 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
cda0: 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
cdb0: 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63  = (int)((const c
cdc0: 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d  har *)pCons->z -
cdd0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
cde0: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
cdf0: 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66   13 + sqlite3Utf
ce00: 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
ce10: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
ce20: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
ce30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ce40: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
ce50: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
ce60: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
ce70: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
ce80: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
ce90: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
cea0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ceb0: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
cec0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ced0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
cee0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
cef0: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
cf00: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
cf10: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
cf20: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
cf30: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
cf40: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
cf50: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
cf60: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
cf70: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
cf80: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
cf90: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
cfa0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
cfb0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
cfc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
cfd0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
cfe0: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
cff0: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
d000: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
d010: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
d020: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
d030: 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
d040: 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
d050: 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
d060: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
d070: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
d080: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
d090: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
d0a0: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
d0b0: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
d0c0: 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  e;.  int iDb;.  
d0d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d0e0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
d0f0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
d100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d110: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d120: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
d130: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
d140: 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
d150: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
d160: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
d170: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
d180: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
d190: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d1a0: 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c   pName2, isTemp,
d1b0: 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20   1, 0, noErr);. 
d1c0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
d1d0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
d1e0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
d1f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d200: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
d210: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
d220: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
d230: 72 72 3d 3d 30 20 29 3b 20 2f 2a 20 49 66 20 73  rr==0 ); /* If s
d240: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
d250: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 4e 55 4c 4c   return non-NULL
d260: 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   then.          
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 2a 2a 20 74 68 65 72 65 20 63 6f 75 6c     ** there coul
d290: 64 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  d not have been 
d2a0: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71  an error */.  sq
d2b0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
d2c0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d2d0: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
d2e0: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
d2f0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
d300: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
d310: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
d320: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
d330: 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c  se, iDb, "view",
d340: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
d350: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
d360: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
d370: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
d380: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d390: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
d3a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
d3b0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
d3c0: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
d3d0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
d3e0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
d3f0: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
d400: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
d410: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
d420: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
d430: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
d440: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
d450: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
d460: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
d470: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
d480: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
d490: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
d4a0: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
d4b0: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
d4c0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
d4d0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
d4e0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
d4f0: 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
d500: 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  DUCE);.  sqlite3
d510: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d520: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
d530: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d540: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
d550: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
d560: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
d570: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
d580: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
d590: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
d5a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
d5b0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
d5c0: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
d5d0: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
d5e0: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
d5f0: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
d600: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
d610: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 73  ;.  if( ALWAYS(s
d620: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20  End.z[0]!=0) && 
d630: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
d640: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
d650: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
d660: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
d670: 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
d680: 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d  Begin->z);.  z =
d690: 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
d6a0: 69 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30 29  ile( ALWAYS(n>0)
d6b0: 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70 61   && sqlite3Isspa
d6c0: 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d  ce(z[n-1]) ){ n-
d6d0: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
d6e0: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
d6f0: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
d700: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
d710: 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
d720: 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
d730: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
d740: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
d750: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73  le(pParse, 0, &s
d760: 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  End, 0);.  retur
d770: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
d780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
d790: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
d7a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
d7b0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
d7c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d7d0: 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54  ALTABLE)./*.** T
d7e0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
d7f0: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
d800: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
d810: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
d820: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
d830: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
d840: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
d850: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
d860: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
d870: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
d880: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
d890: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
d8a0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
d8b0: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
d8c0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
d8d0: 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
d8e0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
d8f0: 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
d900: 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
d910: 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
d920: 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
d930: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
d940: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
d950: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
d960: 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
d970: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
d980: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
d990: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
d9a0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
d9b0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
d9c0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
d9d0: 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
d9e0: 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
d9f0: 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
da00: 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
da10: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
da20: 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
da30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d  connection for m
da40: 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a  alloc errors */.
da50: 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76    int (*xAuth)(v
da60: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
da70: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
da80: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
da90: 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73  st char*);..  as
daa0: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
dab0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dac0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
dad0: 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  E.  if( sqlite3V
dae0: 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
daf0: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29  Parse, pTable) )
db00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
db10: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
db20: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
db30: 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  Table) ) return 
db40: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
db50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
db60: 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  IEW.  /* A posit
db70: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
db80: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
db90: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
dba0: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
dbb0: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
dbc0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
dbd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
dbe0: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
dbf0: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
dc00: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
dc10: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
dc20: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
dc30: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
dc40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
dc50: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
dc60: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
dc70: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
dc80: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
dc90: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
dca0: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
dcb0: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
dcc0: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
dcd0: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
dce0: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
dcf0: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
dd00: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
dd10: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
dd20: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
dd30: 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20   error above is 
dd40: 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
dd50: 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
dd60: 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75  s point..  ** Bu
dd70: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
dd80: 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d  test is still im
dd90: 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f  portant as it do
dda0: 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20  es come up.  ** 
ddb0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
ddc0: 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
ddd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61   CREATE TABLE ma
dde0: 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20  in.ex1(a);.  ** 
ddf0: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
de00: 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45  VIEW ex1 AS SELE
de10: 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20  CT a FROM ex1;. 
de20: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a   **     SELECT *
de30: 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a   FROM temp.ex1;.
de40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
de50: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
de60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
de70: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
de80: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
de90: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
dea0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
deb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
dec0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
ded0: 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
dee0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
def0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
df00: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
df10: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
df20: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
df30: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
df40: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
df50: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
df60: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
df70: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
df80: 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
df90: 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
dfa0: 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
dfb0: 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
dfc0: 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
dfd0: 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
dfe0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
dff0: 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
e000: 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
e010: 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
e020: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
e030: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
e040: 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
e050: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
e060: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
e070: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
e080: 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
e090: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
e0a0: 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  ctDup(db, pTable
e0b0: 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
e0c0: 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
e0d0: 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73   u8 enableLookas
e0e0: 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ide = db->lookas
e0f0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20  ide.bEnabled;.  
e100: 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
e110: 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
e120: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
e130: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
e140: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
e150: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
e160: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
e170: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
e180: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e190: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
e1a0: 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
e1b0: 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
e1c0: 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
e1d0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
e1e0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e1f0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
e200: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
e210: 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20  = xAuth;.#else. 
e220: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
e230: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
e240: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
e250: 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
e260: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
e270: 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c  nabled = enableL
e280: 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50  ookaside;.    pP
e290: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
e2a0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20      if( pSelTab 
e2b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e2c0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
e2d0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
e2e0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
e2f0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
e300: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
e310: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
e320: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
e330: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
e340: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
e350: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
e360: 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b  eTable(pSelTab);
e370: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  .      pTable->p
e380: 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d  Schema->flags |=
e390: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e3a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e3b0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
e3c0: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
e3d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
e3e0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
e3f0: 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20  (db, pSel);.  } 
e400: 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
e410: 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  +;.  }.#endif /*
e420: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
e430: 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
e440: 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
e450: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
e460: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
e470: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e480: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
e490: 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
e4a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
e4b0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
e4c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
e4d0: 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
e4e0: 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
e4f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
e500: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
e510: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
e520: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
e530: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
e540: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
e550: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
e560: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
e570: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
e580: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
e590: 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
e5a0: 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
e5b0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
e5c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
e5d0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
e5e0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
e5f0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
e600: 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43      sqliteResetC
e610: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29  olumnNames(pTab)
e620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
e630: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
e640: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
e650: 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  tViews);.}.#else
e660: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
e670: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42  ViewResetAll(A,B
e680: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
e690: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
e6a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e6b0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
e6c0: 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64  y the VDBE to ad
e6d0: 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61  just the interna
e6e0: 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64  l schema.** used
e6f0: 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20   by SQLite when 
e700: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
e710: 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f  moves a table ro
e720: 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20  ot page. The.** 
e730: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74  root-page of a t
e740: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e  able or index in
e750: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61   database iDb ha
e760: 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69  s changed from i
e770: 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a  From.** to iTo..
e780: 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37  **.** Ticket #17
e790: 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  28:  The symbol 
e7a0: 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c  table might stil
e7b0: 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d  l contain inform
e7c0: 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
e7d0: 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65  es and/or indice
e7e0: 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70  s that are the p
e7f0: 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
e800: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79  deleted..** If y
e810: 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20  ou are unlucky, 
e820: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
e830: 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20  eted indices or 
e840: 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20  tables might.** 
e850: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f  have the same ro
e860: 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  otpage number as
e870: 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20   the real table 
e880: 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  or index that is
e890: 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  .** being moved.
e8a0: 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73    So we cannot s
e8b0: 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66  top searching af
e8c0: 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  ter the first ma
e8d0: 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20  tch .** because 
e8e0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
e8f0: 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65  might be for one
e900: 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
e910: 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61  indices.** or ta
e920: 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65  bles and not the
e930: 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61   table/index tha
e940: 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65  t is actually be
e950: 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65  ing moved..** We
e960: 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c   must continue l
e970: 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c  ooping until all
e980: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
e990: 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74  ces with.** root
e9a0: 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65  page==iFrom have
e9b0: 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
e9c0: 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61  to have a rootpa
e9d0: 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20  ge of iTo.** in 
e9e0: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74  order to be cert
e9f0: 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20  ain that we got 
ea00: 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a  the right one..*
ea10: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
ea20: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ea30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
ea40: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
ea50: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
ea60: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
ea70: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
ea80: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48  sh *pHash;..  pH
ea90: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
eaa0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
eab0: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
eac0: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
ead0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
eae0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
eaf0: 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
eb00: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
eb10: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
eb20: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
eb30: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
eb40: 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
eb50: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  iTo;.    }.  }. 
eb60: 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
eb70: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
eb80: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
eb90: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
eba0: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
ebb0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
ebc0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
ebd0: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
ebe0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
ebf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
ec00: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
ec10: 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
ec20: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
ec30: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
ec40: 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
ec50: 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
ec60: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
ec70: 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
ec80: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
ec90: 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
eca0: 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
ecb0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
ecc0: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
ecd0: 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
ece0: 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
ecf0: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
ed00: 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
ed10: 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
ed20: 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
ed30: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
ed40: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
ed50: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
ed60: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
ed70: 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
ed80: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
ed90: 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
eda0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
edb0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
edc0: 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  );.  int r1 = sq
edd0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
ede0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
edf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ee00: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
ee10: 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
ee20: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
ee30: 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
ee40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ee50: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
ee60: 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
ee70: 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
ee80: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
ee90: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
eea0: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
eeb0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
eec0: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
eed0: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
eee0: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
eef0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
ef00: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
ef10: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ef20: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
ef30: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
ef40: 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
ef50: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
ef60: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
ef70: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
ef80: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
ef90: 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
efa0: 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
efb0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
efc0: 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
efd0: 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
efe0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
eff0: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
f000: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f010: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
f020: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
f030: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
f040: 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
f050: 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
f060: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
f070: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
f080: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
f090: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
f0a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
f0b0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f0c0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
f0d0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
f0e0: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
f0f0: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
f100: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
f110: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
f120: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
f130: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f140: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
f150: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
f160: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
f170: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
f180: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
f190: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
f1a0: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
f1b0: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
f1c0: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
f1d0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
f1e0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
f1f0: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
f200: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
f210: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
f220: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
f230: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f240: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f250: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f260: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f270: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f280: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f290: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
f2a0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f2b0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
f2c0: 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
f2d0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f2e0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f2f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
f300: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f310: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
f320: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
f330: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
f340: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
f350: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
f360: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
f370: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
f380: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
f390: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
f3a0: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
f3b0: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
f3c0: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
f3d0: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
f3e0: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
f3f0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
f400: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
f410: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
f420: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
f430: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
f440: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
f450: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
f460: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
f470: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
f480: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
f490: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
f4a0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
f4b0: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
f4c0: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
f4d0: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
f4e0: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
f4f0: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
f500: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
f510: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
f520: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
f530: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
f540: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
f550: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
f560: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
f570: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
f580: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
f590: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
f5a0: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
f5b0: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
f5c0: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
f5d0: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
f5e0: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
f5f0: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
f600: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
f610: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
f620: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
f630: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
f640: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
f650: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
f660: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
f670: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
f680: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
f690: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
f6a0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
f6b0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
f6c0: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
f6d0: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
f6e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f6f0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
f700: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
f710: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
f720: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
f730: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
f740: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
f750: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
f760: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
f770: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f780: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
f790: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
f7a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
f7b0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
f7c0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
f7d0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
f7e0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
f7f0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
f800: 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
f810: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
f820: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
f830: 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
f840: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
f850: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f860: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
f870: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
f880: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
f890: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
f8a0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
f8b0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
f8c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f8d0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
f8e0: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
f8f0: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
f900: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
f910: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f920: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
f930: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
f940: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
f950: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
f960: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f970: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f980: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
f990: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
f9a0: 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
f9b0: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
f9c0: 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
f9d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
f9e0: 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20  pParse, isView, 
f9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 61               pNa
fa10: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
fa20: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
fa30: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
fa40: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
fa50: 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20  ( noErr ){.     
fa60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65   sqlite3ErrorCle
fa70: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
fa80: 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  }.    goto exit_
fa90: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
faa0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
fab0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
fac0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
fad0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
fae0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
faf0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
fb00: 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
fb10: 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
fb20: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
fb30: 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
fb40: 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
fb50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
fb60: 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
fb70: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
fb80: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
fb90: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
fba0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fbb0: 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
fbc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fbd0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
fbe0: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
fbf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
fc00: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
fc10: 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
fc20: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
fc30: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
fc40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fc50: 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
fc60: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
fc70: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fc80: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
fc90: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
fca0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fcb0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
fcc0: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
fcd0: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
fce0: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
fcf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
fd00: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
fd10: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
fd20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
fd30: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fd40: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
fd50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fd60: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fd70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
fd80: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
fd90: 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53  {.      code = S
fda0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
fdb0: 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d  E;.      zArg2 =
fdc0: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
fdd0: 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f  e(db, pTab)->pMo
fde0: 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66  d->zName;.#endif
fdf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fe00: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
fe10: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
fe20: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
fe30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
fe40: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
fe50: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
fe60: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
fe70: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
fe80: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
fe90: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
fea0: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
feb0: 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a  >zName, zArg2, z
fec0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
fed0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fee0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fef0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
ff00: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
ff10: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
ff20: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
ff30: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
ff40: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
ff50: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
ff60: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
ff70: 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
ff80: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
ff90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
ffa0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ffb0: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
ffc0: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
ffd0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ffe0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fff0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
10000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10010 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
10020 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
10030 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
10040 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
10050 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
10060 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
10070 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
10080 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
10090 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
100a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
100b0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
100c0 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
100d0 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
100e0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
100f0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
10100 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
10110 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
10120 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
10130 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10140 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
10150 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
10160 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
10170 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
10180 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10190 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
101a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
101b0 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
101c0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
101d0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
101e0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
101f0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
10200 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
10210 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
10220 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62  pTrigger;.    Db
10230 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
10240 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
10250 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
10260 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
10270 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10290 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
102a0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
102b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
102c0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
102d0 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
102e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
102f0 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
10300 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
10310 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
10320 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
10330 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61      ** is genera
10340 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
10350 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
10360 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
10370 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65      ** sqlite_te
10380 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
10390 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
103a0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
103b0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
103c0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
103d0 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
103e0 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
103f0 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
10400 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
10410 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
10420 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63     pTrigger->pSc
10430 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
10440 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
10450 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
10460 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
10470 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20  pTrigger);.     
10480 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
10490 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
104a0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
104b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
104c0 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d  EMENT.    /* Rem
104d0 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
104e0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
104f0 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
10500 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
10510 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
10520 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
10530 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
10540 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
10550 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20  opped.    ** at 
10560 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
10570 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
10580 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
10590 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  le needs to.    
105a0 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
105b0 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
105c0 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
105d0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
105e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
105f0 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
10600 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
10610 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
10620 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10630 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
10640 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73  DELETE FROM %s.s
10650 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
10660 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
10670 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
10680 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
10690 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
106a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ndif..    /* Dro
106b0 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
106c0 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
106d0 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
106e0 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
106f0 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
10700 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
10710 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
10720 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
10730 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
10740 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
10750 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
10760 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
10770 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
10780 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
10790 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
107a0 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
107b0 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
107c0 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
107d0 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
107e0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
107f0 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
10800 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
10810 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
10820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
10830 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
10840 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
10850 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
10860 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
10870 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
10880 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
10890 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
108a0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
108b0 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ), pTab->zName);
108c0 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e  ..    /* Drop an
108d0 79 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f  y statistics fro
108e0 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
108f0 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74 20  t1 table, if it 
10900 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 66  exists */.    if
10910 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
10920 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
10930 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69  tat1", db->aDb[i
10940 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  Db].zName) ){.  
10950 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10960 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
10970 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
10980 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
10990 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25 51  at1 WHERE tbl=%Q
109a0 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70  ", pDb->zName, p
109b0 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
109c0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
109d0 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
109e0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
109f0 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
10a00 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
10a10 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
10a20 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
10a30 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
10a40 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
10a50 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
10a60 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
10a70 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
10a80 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  */.    if( IsVir
10a90 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
10aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ab0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
10ac0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
10ad0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10af0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10b00 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
10b10 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
10b20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
10b30 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
10b40 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
10b50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65  .  }.  sqliteVie
10b60 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
10b70 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74  b);..exit_drop_t
10b80 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
10b90 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
10ba0 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
10bb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10bc0 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
10bd0 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
10be0 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
10bf0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
10c00 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10c10 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
10c20 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
10c30 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
10c40 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
10c50 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
10c60 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
10c70 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
10c80 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
10c90 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
10ca0 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
10cb0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
10cc0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
10cd0 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
10ce0 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
10cf0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
10d00 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
10d10 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
10d20 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
10d30 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
10d40 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
10d50 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
10d60 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
10d70 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
10d80 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
10d90 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
10da0 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
10db0 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
10dc0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
10dd0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
10de0 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
10df0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
10e00 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
10e10 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
10e20 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
10e30 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
10e40 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10e50 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
10e60 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
10e70 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
10e80 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
10e90 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
10ea0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
10eb0 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
10ec0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10ed0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
10ee0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10ef0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10f00 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
10f10 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
10f20 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
10f30 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
10f40 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
10f50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
10f60 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
10f70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10f80 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10f90 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
10fa0 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
10fb0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
10fc0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
10fd0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
10fe0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
10ff0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
11000 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11010 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11020 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
11030 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11040 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
11050 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
11060 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
11070 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
11080 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
11090 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
110a0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
110b0 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
110c0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
110d0 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
110e0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
110f0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
11100 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
11110 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
11120 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
11130 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
11140 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
11150 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
11160 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
11170 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11180 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
11190 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
111a0 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
111b0 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
111c0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
111d0 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
111e0 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
111f0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
11200 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
11210 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
11220 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
11230 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
11240 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
11250 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
11260 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11270 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
11280 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
11290 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
112a0 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
112b0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
112c0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
112d0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
112e0 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
112f0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
11300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
11310 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
11320 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
11330 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
11340 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
11350 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
11360 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
11370 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
11380 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
11390 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
113a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
113b0 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
113c0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
113d0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
113e0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
113f0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11400 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
11410 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
11420 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
11430 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
11440 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
11450 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
11460 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
11470 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
11480 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
11490 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
114a0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
114b0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
114c0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
114d0 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
114e0 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
114f0 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
11500 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
11510 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
11520 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
11530 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
11540 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
11550 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
11560 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
11570 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
11580 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
11590 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
115a0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
115b0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
115c0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
115d0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
115e0 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
115f0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
11600 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
11610 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11630 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
11640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11650 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
11660 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
11670 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
11680 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
11690 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
116a0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
116b0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
116c0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
116d0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
116e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
116f0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
11700 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11710 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11720 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
11730 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11740 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
11750 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
11760 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
11770 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
11780 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
11790 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
117a0 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
117b0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
117c0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
117d0 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
117e0 66 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  f = (u8)(flags &
117f0 20 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d   0xff);.  pFKey-
11800 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 75  >updateConf = (u
11810 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29  8)((flags >> 8 )
11820 20 26 20 30 78 66 66 29 3b 0a 20 20 70 46 4b 65   & 0xff);.  pFKe
11830 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
11840 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 31  (u8)((flags >> 1
11850 36 20 29 20 26 20 30 78 66 66 29 3b 0a 0a 20 20  6 ) & 0xff);..  
11860 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
11870 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
11880 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
11890 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
118a0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71    pFKey->zTo, sq
118b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46  lite3Strlen30(pF
118c0 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64  Key->zTo), (void
118d0 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
118e0 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
118f0 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ey ){.    db->ma
11900 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
11910 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
11920 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
11930 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
11940 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
11950 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
11960 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
11970 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
11980 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
11990 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
119a0 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
119b0 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
119c0 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
119d0 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
119e0 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
119f0 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
11a00 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
11a10 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
11a20 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
11a30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
11a40 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
11a50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11a60 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
11a70 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
11a80 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11a90 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
11aa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11ab0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
11ac0 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
11ad0 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
11ae0 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
11af0 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
11b00 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
11b10 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
11b20 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
11b30 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
11b40 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
11b50 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
11b60 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
11b70 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
11b80 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
11b90 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
11ba0 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
11bb0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
11bc0 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
11bd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
11be0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
11bf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11c00 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
11c10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11c20 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
11c30 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
11c40 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
11c50 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
11c60 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
11c70 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
11c80 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
11c90 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
11ca0 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
11cb0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
11cc0 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
11cd0 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
11ce0 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
11cf0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11d00 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11d10 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
11d20 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
11d30 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
11d40 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
11d50 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
11d60 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
11d70 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
11d80 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
11d90 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
11da0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
11db0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
11dc0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
11dd0 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
11de0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
11df0 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
11e00 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
11e10 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
11e20 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
11e30 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
11e40 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11e50 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
11e60 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
11e70 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
11e80 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
11e90 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
11ea0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
11eb0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
11ec0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
11ed0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
11ee0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
11ef0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
11f00 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
11f10 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
11f20 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
11f30 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
11f40 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
11f50 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
11f60 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
11f70 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
11f80 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
11f90 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
11fa0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
11fb0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
11fc0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
11fd0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
11fe0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
11ff0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
12000 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
12010 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
12020 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
12050 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
12060 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12080 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
12090 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
120a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120b0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
120c0 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
120d0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
120e0 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
120f0 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
12100 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
12110 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
12120 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20   int regIdxKey; 
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e  /* Registers con
12150 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
12160 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72  x key */.  int r
12170 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
12180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12190 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
121a0 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72  semblied index r
121b0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
121c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
121d0 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
121e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
121f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
12200 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12210 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
12220 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
12230 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12240 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12250 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
12260 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
12270 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
12280 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
12290 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
122a0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
122b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
122c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
122d0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
122e0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
122f0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
12300 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
12310 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
12320 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
12330 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
12340 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
12350 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12360 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
12370 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
12380 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
12390 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
123a0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
123b0 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
123c0 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
123d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
123e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp2(v, OP_Clea
123f0 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
12400 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
12410 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
12420 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
12430 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12440 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
12450 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
12460 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
12470 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
12480 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
12490 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
124a0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
124b0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
124c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
124d0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 1);.  }.  sqli
124e0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
124f0 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
12500 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
12510 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
12520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12530 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
12540 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63  ab, 0);.  regRec
12550 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
12560 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12570 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73  .  regIdxKey = s
12580 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
12590 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
125a0 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67  Index, iTab, reg
125b0 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66  Record, 1);.  if
125c0 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
125d0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
125e0 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52    const int regR
125f0 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79  owid = regIdxKey
12600 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   + pIndex->nColu
12610 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  mn;.    const in
12620 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
12630 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12640 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a   + 2;.    void *
12650 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d   const pRegKey =
12660 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
12670 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a  TR(regIdxKey);..
12680 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73      /* The regis
12690 74 65 72 73 20 61 63 63 65 73 73 65 64 20 62 79  ters accessed by
126a0 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
126b0 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c   opcode were all
126c0 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73  ocated.    ** us
126d0 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54 65  ing sqlite3GetTe
126e0 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65  mpRange() inside
126f0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47   of the sqlite3G
12700 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
12710 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62  ).    ** call ab
12720 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65  ove. Just before
12730 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77   that function w
12740 61 73 20 66 72 65 65 64 20 74 68 65 79 20 77 65  as freed they we
12750 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  re released.    
12760 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62  ** (made availab
12770 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  le to the compil
12780 65 72 20 66 6f 72 20 72 65 75 73 65 29 20 75 73  er for reuse) us
12790 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ing .    ** sqli
127a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
127b0 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d  nge(). So in som
127c0 65 20 77 61 79 73 20 68 61 76 69 6e 67 20 74 68  e ways having th
127d0 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20  e OP_IsUnique.  
127e0 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20    ** opcode use 
127f0 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
12800 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64  d within seems d
12810 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65  angerous. Howeve
12820 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20  r, since.    ** 
12830 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  we can be sure t
12840 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d  hat no other tem
12850 70 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65  p registers have
12860 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
12870 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c      ** since sql
12880 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12890 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  ange() was calle
128a0 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  d, it is safe to
128b0 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20   do so..    */. 
128c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
128d0 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69  dOp4(v, OP_IsUni
128e0 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72  que, iIdx, j2, r
128f0 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79  egRowid, pRegKey
12900 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
12910 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
12920 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20  traint(.        
12930 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74  pParse, OE_Abort
12940 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  , "indexed colum
12950 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
12960 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  e", P4_STATIC);.
12970 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12980 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
12990 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
129a0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
129b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
129c0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
129d0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
129e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
129f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
12a00 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
12a10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12a20 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
12a30 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r1+1);.  sqlite3
12a40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12a50 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
12a60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12a70 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
12a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a90 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
12aa0 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iIdx);.}../*.**
12ab0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
12ac0 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
12ad0 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
12ae0 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
12af0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
12b00 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
12b10 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
12b20 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
12b30 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
12b40 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
12b50 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
12b60 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
12b70 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
12b80 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
12b90 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
12ba0 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
12bb0 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
12bc0 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
12bd0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
12be0 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
12bf0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
12c00 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
12c10 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
12c20 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
12c30 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
12c40 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
12c50 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
12c60 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
12c70 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
12c80 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
12c90 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
12ca0 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
12cb0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
12cc0 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
12cd0 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
12ce0 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
12cf0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
12d00 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
12d10 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
12d20 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
12d30 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
12d40 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72   successfully, r
12d50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
12d60 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  to the new Index
12d70 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54  .** structure. T
12d80 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73  his is used by s
12d90 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
12da0 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68  Key() to mark th
12db0 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  e index.** as th
12dc0 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79  e tables primary
12dd0 20 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f   key (Index.auto
12de0 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e  Index==2)..*/.In
12df0 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61  dex *sqlite3Crea
12e00 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
12e10 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
12e20 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
12e30 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
12e40 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
12e50 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
12e60 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
12e70 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
12e80 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
12e90 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
12ea0 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
12eb0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
12ec0 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
12ed0 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
12ee0 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
12ef0 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
12f00 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
12f10 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
12f20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
12f30 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
12f40 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
12f50 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
12f60 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
12f70 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
12f80 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
12f90 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
12fa0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
12fb0 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
12fc0 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
12fd0 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
12fe0 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54  pEnd,       /* T
12ff0 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
13000 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
13010 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
13020 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
13030 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
13040 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
13050 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
13060 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
13070 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f  otExist     /* O
13080 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
13090 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
130a0 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  s */.){.  Index 
130b0 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f  *pRet = 0;     /
130c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74  * Pointer to ret
130d0 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  urn */.  Table *
130e0 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pTab = 0;     /*
130f0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
13100 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
13110 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f  *pIndex = 0;   /
13120 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
13130 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
13140 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
13150 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13160 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
13170 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
13180 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13190 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e  characters in zN
131a0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ame */.  int i, 
131b0 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49  j;.  Token nullI
131c0 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b  d;        /* Fak
131d0 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
131e0 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
131f0 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
13200 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
13210 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
13220 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
13230 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
13240 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
13250 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
13260 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
13270 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
13280 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13290 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
132a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
132b0 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
132c0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
132d0 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
132e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
132f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13300 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
13310 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
13320 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
13330 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
13340 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
13350 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
13360 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
13370 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
13380 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
13390 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
133a0 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
133b0 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  */.  int nCol;. 
133c0 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
133d0 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b  .  char *zExtra;
133e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61  ..  assert( pSta
133f0 72 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30  rt==0 || pEnd!=0
13400 20 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74   ); /* pEnd must
13410 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   be non-NULL if 
13420 70 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61  pStart is */.  a
13430 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
13440 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  Err==0 );      /
13450 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
13460 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
13470 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
13480 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
13490 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
134a0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
134b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
134c0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
134d0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
134e0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
134f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13500 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
13510 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
13520 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
13530 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
13540 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
13550 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
13560 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
13570 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
13580 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
13590 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
135a0 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
135b0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
135c0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
135d0 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
135e0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
135f0 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
13600 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
13610 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
13620 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
13630 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
13640 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
13650 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
13660 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
13670 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
13680 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
13690 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
136a0 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ndex;..#ifndef S
136b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
136c0 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
136d0 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
136e0 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
136f0 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62  k if the the tab
13700 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
13710 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
13720 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
13730 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
13740 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
13750 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
13760 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
13770 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13780 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
13790 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
137a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
137b0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
137c0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
137d0 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
137e0 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
137f0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
13800 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
13810 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
13820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
13830 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
13840 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
13850 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
13860 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
13870 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
13880 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
13890 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
138a0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
138b0 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
138c0 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
138d0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
138e0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
138f0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
13900 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
13910 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
13920 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
13930 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
13940 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
13950 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  le(pParse, 0, pT
13960 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
13970 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
13980 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
13990 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
139a0 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  !pTab || db->mal
139b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
139c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
139d0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
139e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
139f0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
13a00 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ema );.  }else{.
13a10 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
13a20 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
13a30 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
13a40 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
13a50 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
13a60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13a70 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
13a80 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
13a90 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
13aa0 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
13ab0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
13ac0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
13ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
13ae0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
13af0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
13b00 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
13b10 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
13b20 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 6d 65  =0 .       && me
13b30 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  mcmp(&pTab->zNam
13b40 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
13b50 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ,9)!=0 ){.    sq
13b60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13b70 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
13b80 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
13b90 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
13ba0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13bb0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13bc0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13bd0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
13be0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
13bf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13c00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13c10 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
13c20 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
13c30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13c40 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
13c50 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
13c60 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13c70 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
13c80 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13c90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13ca0 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
13cb0 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
13cc0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
13cd0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13ce0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
13cf0 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
13d00 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
13d10 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
13d20 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
13d30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
13d40 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
13d50 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
13d60 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
13d70 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
13d80 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
13d90 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
13da0 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
13db0 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
13dc0 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
13dd0 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
13de0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
13df0 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
13e00 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
13e10 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
13e20 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
13e30 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
13e40 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
13e50 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
13e60 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
13e70 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
13e80 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
13e90 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
13ea0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
13eb0 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
13ec0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
13ed0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
13ee0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
13ef0 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
13f00 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
13f10 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
13f20 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
13f30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
13f40 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
13f50 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
13f60 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
13f70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13f80 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  x;.    if( SQLIT
13f90 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
13fa0 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
13fb0 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
13fc0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13fd0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13fe0 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
13ff0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
14000 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
14010 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
14020 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
14030 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14040 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
14050 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
14060 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
14070 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
14080 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14090 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
140a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
140b0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
140c0 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e  db, zName, pDb->
140d0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
140e0 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
140f0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  st ){.        sq
14100 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14110 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
14120 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
14130 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
14140 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14150 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14160 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14170 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
14180 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
14190 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
141a0 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
141b0 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
141c0 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
141d0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
141e0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
141f0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25  lite_autoindex_%
14200 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s_%d", pTab->zNa
14210 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  me, n);.    if( 
14220 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
14230 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14240 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14250 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
14260 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
14270 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
14280 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
14290 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
142a0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
142b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
142c0 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d  *zDb = pDb->zNam
142d0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
142e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
142f0 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
14300 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
14310 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
14320 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14330 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14340 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
14350 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
14360 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
14370 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
14380 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
14390 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
143a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
143b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
143c0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
143d0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
143e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
143f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14400 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14410 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
14420 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
14430 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
14440 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
14450 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
14460 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
14470 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
14480 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
14490 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
144a0 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
144b0 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
144c0 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
144d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
144e0 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
144f0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
14500 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
14510 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
14520 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28  qlite3Strlen30((
14530 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b  char*)nullId.z);
14540 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
14550 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
14560 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  nd(pParse, 0, 0)
14570 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
14580 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
14590 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
145a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
145b0 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
145c0 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20  pList, &nullId, 
145d0 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  0);.    pList->a
145e0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
145f0 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20  (u8)sortOrder;. 
14600 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
14610 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
14620 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
14630 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
14640 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
14650 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
14660 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14670 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
14680 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14690 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
146a0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
146b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
146c0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29  .    if( pExpr )
146d0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
146e0 2a 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e  *pColl = pExpr->
146f0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20  pColl;.      /* 
14700 45 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20  Either pColl!=0 
14710 6f 72 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  or there was an 
14720 4f 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20 42 75  OOM failure.  Bu
14730 74 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20  t if an OOM.    
14740 20 20 2a 2a 20 66 61 69 6c 75 72 65 20 77 65 20    ** failure we 
14750 68 61 76 65 20 71 75 69 74 20 62 65 66 6f 72 65  have quit before
14760 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
14770 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  oint. */.      i
14780 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
14790 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 74   ){.        nExt
147a0 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
147b0 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c  e3Strlen30(pColl
147c0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
147d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
147e0 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
147f0 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
14800 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
14810 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
14820 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
14830 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e   nCol = pList->n
14840 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Expr;.  pIndex =
14850 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
14860 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20  Zero(db, .      
14870 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14890 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
148a0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
148b0 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (int)*nCol +    
148c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
148d0 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
148e0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
148f0 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20  (nCol+1) +      
14900 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45   /* Index.aiRowE
14910 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  st   */.      si
14920 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f  zeof(char *)*nCo
14930 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  l +        /* In
14940 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a  dex.azColl     *
14950 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75  /.      sizeof(u
14960 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  8)*nCol +       
14970 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
14980 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ortOrder */.    
14990 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20    nName + 1 +   
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
149b0 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20  * Index.zName   
149c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74     */.      nExt
149d0 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
149e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
149f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14a00 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  ames */.  );.  i
14a10 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14a20 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
14a30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14a40 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d  x;.  }.  pIndex-
14a50 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
14a60 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a  *)(&pIndex[1]);.
14a70 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
14a80 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49  mn = (int *)(&pI
14a90 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  ndex->azColl[nCo
14aa0 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  l]);.  pIndex->a
14ab0 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  iRowEst = (unsig
14ac0 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  ned *)(&pIndex->
14ad0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b  aiColumn[nCol]);
14ae0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
14af0 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
14b00 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
14b10 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e  [nCol+1]);.  pIn
14b20 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
14b30 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ar *)(&pIndex->a
14b40 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29  SortOrder[nCol])
14b50 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68  ;.  zExtra = (ch
14b60 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a  ar *)(&pIndex->z
14b70 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a  Name[nName+1]);.
14b80 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
14b90 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
14ba0 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
14bb0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
14bc0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
14bd0 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
14be0 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
14bf0 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
14c00 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
14c10 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28  utoIndex = (u8)(
14c20 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e  pName==0);.  pIn
14c30 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
14c40 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
14c50 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ema;..  /* Check
14c60 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
14c70 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
14c80 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
14c90 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
14ca0 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
14cb0 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
14cc0 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
14cd0 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
14ce0 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
14cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
14d00 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
14d10 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
14d20 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  C */.  }..  /* S
14d30 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
14d40 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
14d50 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
14d60 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
14d70 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
14d80 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
14d90 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
14da0 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
14db0 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
14dc0 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
14dd0 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  und..  **.  ** T
14de0 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74  ODO:  Add a test
14df0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
14e00 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  at the same colu
14e10 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a  mn is not named.
14e20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f    ** more than o
14e30 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73  nce within the s
14e40 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79  ame index.  Only
14e50 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   the first insta
14e60 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  nce of.  ** the 
14e70 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72  column will ever
14e80 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
14e90 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65  optimizer.  Note
14ea0 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a   that using the.
14eb0 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e    ** same column
14ec0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
14ed0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72  cannot be an err
14ee0 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20  or because that 
14ef0 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61  would .  ** brea
14f00 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  k backwards comp
14f10 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e  atibility - it n
14f20 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72  eeds to be a war
14f30 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ning..  */.  for
14f40 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d  (i=0, pListItem=
14f50 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
14f60 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
14f70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
14f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
14f90 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65  lName = pListIte
14fa0 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f  m->zName;.    Co
14fb0 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20  lumn *pTabCol;. 
14fc0 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
14fd0 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63  SortOrder;.    c
14fe0 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15000 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
15010 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
15020 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f   for(j=0, pTabCo
15030 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
15040 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
15050 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
15060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
15070 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20  rICmp(zColName, 
15080 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d  pTabCol->zName)=
15090 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
150a0 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
150b0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
150c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
150d0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
150e0 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
150f0 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
15100 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
15110 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   zColName);.    
15120 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15130 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
15140 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
15150 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
15160 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
15170 6e 20 6f 66 20 74 68 65 20 41 4c 57 41 59 53 28  n of the ALWAYS(
15180 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
15190 2d 3e 70 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75  ->pColl):  Becau
151a0 73 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  se of.    ** the
151b0 20 77 61 79 20 74 68 65 20 22 69 64 78 6c 69 73   way the "idxlis
151c0 74 22 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  t" non-terminal 
151d0 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  is constructed b
151e0 79 20 74 68 65 20 70 61 72 73 65 72 2c 0a 20 20  y the parser,.  
151f0 20 20 2a 2a 20 69 66 20 70 4c 69 73 74 49 74 65    ** if pListIte
15200 6d 2d 3e 70 45 78 70 72 20 69 73 20 6e 6f 74 20  m->pExpr is not 
15210 6e 75 6c 6c 20 74 68 65 6e 20 65 69 74 68 65 72  null then either
15220 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
15230 72 2d 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20  r->pColl.    ** 
15240 6d 75 73 74 20 65 78 69 73 74 20 6f 72 20 65 6c  must exist or el
15250 73 65 20 74 68 65 72 65 20 6d 75 73 74 20 68 61  se there must ha
15260 76 65 20 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65  ve been an OOM e
15270 72 72 6f 72 2e 20 20 42 75 74 20 69 66 20 74 68  rror.  But if th
15280 65 72 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 61  ere.    ** was a
15290 6e 20 4f 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20  n OOM error, we 
152a0 77 6f 75 6c 64 20 6e 65 76 65 72 20 72 65 61 63  would never reac
152b0 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f  h this point. */
152c0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
152d0 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 41 4c 57  em->pExpr && ALW
152e0 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  AYS(pListItem->p
152f0 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a  Expr->pColl) ){.
15300 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b        int nColl;
15310 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
15320 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
15330 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20  >pColl->zName;. 
15340 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
15350 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
15360 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
15370 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
15380 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
15390 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
153a0 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
153b0 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
153c0 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
153d0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
153e0 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
153f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15400 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
15410 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
15420 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
15430 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  {.        zColl 
15440 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d  = db->pDfltColl-
15450 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  >zName;.      }.
15460 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
15470 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
15480 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
15490 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
154a0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
154b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
154c0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
154d0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
154e0 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
154f0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
15500 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
15510 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
15520 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
15530 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
15540 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
15550 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
15560 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
15570 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
15580 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  ;..  if( pTab==p
15590 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
155a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
155b0 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
155c0 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
155d0 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
155e0 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
155f0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
15600 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
15610 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
15620 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
15630 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
15640 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
15650 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
15660 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
15670 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
15680 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
15690 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
156a0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
156b0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
156c0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
156d0 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
156e0 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
156f0 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
15700 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
15710 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
15720 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
15730 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
15740 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
15750 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
15760 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
15770 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
15780 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
15790 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
157a0 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
157b0 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
157c0 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
157d0 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
157e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e  **.    ** Two UN
157f0 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
15800 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
15810 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
15820 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a  quivalent.    **
15830 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72   (and thus suppr
15840 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e  essing the secon
15850 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74  d one) even if t
15860 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65  hey have differe
15870 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f  nt.    ** sort o
15880 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  rders..    **.  
15890 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72    ** If there ar
158a0 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c  e different coll
158b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
158c0 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  or if the column
158d0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
158e0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72  constraint occur
158f0 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72   in different or
15900 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ders, then the c
15910 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20  onstraints are. 
15920 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
15930 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f   distinct and bo
15940 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70  th result in sep
15950 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20  arate indices.. 
15960 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
15970 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
15980 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
15990 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
159a0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
159b0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
159c0 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
159d0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
159e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
159f0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
15a00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15a10 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
15a20 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
15a30 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
15a40 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
15a50 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
15a60 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
15a70 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
15a80 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
15a90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20  onst char *z1;. 
15aa0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15ab0 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 69  r *z2;.        i
15ac0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
15ad0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
15ae0 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
15af0 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  k;.        z1 = 
15b00 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
15b10 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49  .        z2 = pI
15b20 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
15b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21  .        if( z1!
15b40 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74  =z2 && sqlite3St
15b50 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
15b60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15b70 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
15b80 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
15b90 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
15ba0 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
15bb0 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
15bc0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
15bd0 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
15be0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
15bf0 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
15c00 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
15c10 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
15c20 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
15c30 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
15c40 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
15c50 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
15c60 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
15c70 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
15c80 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
15c90 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
15ca0 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
15cb0 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
15cc0 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
15cd0 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
15ce0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
15cf0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
15d00 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
15d10 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
15d20 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
15d30 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
15d40 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
15d50 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
15d60 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
15d70 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
15d80 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
15d90 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
15da0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
15db0 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
15dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15dd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15df0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
15e00 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
15e10 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
15e20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15e30 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
15e40 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
15e50 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
15e60 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
15e70 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
15e80 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
15e90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15ea0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15eb0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
15ec0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
15ed0 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
15ee0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
15ef0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
15f00 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
15f10 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
15f20 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
15f30 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
15f40 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
15f50 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
15f60 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
15f70 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
15f80 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
15f90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
15fb0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  ex->zName, sqlit
15fc0 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65  e3Strlen30(pInde
15fd0 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20       pIndex);.  
16000 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
16010 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
16020 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
16030 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
16040 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d */.      db->m
16050 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
16060 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
16070 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
16080 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
16090 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
160a0 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
160b0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
160c0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
160d0 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
160e0 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
160f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16100 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
16110 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
16120 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
16130 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
16140 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
16150 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
16160 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
16170 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
16180 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
16190 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
161a0 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
161b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
161c0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
161d0 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
161e0 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
161f0 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
16200 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
16210 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
16220 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
16230 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
16240 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
16250 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
16260 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
16270 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
16280 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
16290 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
162a0 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
162b0 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
162c0 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
162d0 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
162e0 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
162f0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
16300 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
16310 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
16320 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
16330 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
16340 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
16350 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
16360 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
16370 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
16380 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
16390 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
163a0 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
163b0 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
163c0 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
163d0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
163e0 20 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f 2a 20 69   */.  else{ /* i
163f0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
16400 3d 3d 30 20 29 20 2a 2f 0a 20 20 20 20 56 64 62  ==0 ) */.    Vdb
16410 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
16420 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
16430 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
16440 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73  nMem;..    v = s
16450 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16460 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
16470 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
16480 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a  create_index;...
16490 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
164a0 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
164b0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  he index.    */.
164c0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
164d0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
164e0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
164f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
16510 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d  teIndex, iDb, iM
16520 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74  em);..    /* Gat
16530 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
16540 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
16550 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
16560 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
16570 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
16580 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
16590 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
165a0 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d    assert( pEnd!=
165b0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 );.      /* A 
165c0 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
165d0 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
165e0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
165f0 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
16600 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
16610 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
16620 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
16630 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
16640 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
16650 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20   UNIQUE",.      
16660 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d    pEnd->z - pNam
16670 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20  e->z + 1,.      
16680 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20    pName->z);.   
16690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
166a0 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   An automatic in
166b0 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61  dex created by a
166c0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
166d0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
166e0 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53  t */.      /* zS
166f0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
16700 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
16710 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20     zStmt = 0;.  
16720 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
16730 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
16740 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
16750 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  is index.    */.
16760 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
16770 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
16780 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
16790 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
167a0 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
167b0 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  #%d,%Q);",.     
167c0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
167d0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
167e0 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
167f0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
16800 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
16810 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d  Name,.        iM
16820 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  em,.        zStm
16830 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
16840 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
16850 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
16860 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
16870 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
16880 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
16890 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
168a0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
168b0 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
168c0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
168d0 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
168e0 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
168f0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
16900 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
16910 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
16920 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
16930 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
16940 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
16950 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16960 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
16970 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20  , iDb, 0, 0,.   
16980 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
16990 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
169a0 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
169b0 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43  ame), P4_DYNAMIC
169c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
169d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
169e0 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20  _Expire, 0);.   
169f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65   }.  }..  /* Whe
16a00 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
16a10 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
16a20 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
16a30 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
16a40 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
16a50 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
16a60 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
16a70 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
16a80 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
16a90 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
16aa0 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
16ab0 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ect constraint c
16ac0 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73  heck.  ** proces
16ad0 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33  sing (in sqlite3
16ae0 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
16af0 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70  ntChecks()) as p
16b00 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41  art of.  ** UPDA
16b10 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74  TE and INSERT st
16b20 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f  atements.  .  */
16b30 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
16b40 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
16b50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
16b60 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
16b70 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
16b80 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
16b90 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
16ba0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
16bb0 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
16bc0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
16bd0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
16be0 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
16bf0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
16c00 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
16c10 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
16c20 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
16c30 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
16c40 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
16c50 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
16c60 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
16c70 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
16c80 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
16c90 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
16ca0 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
16cb0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
16cc0 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
16cd0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
16ce0 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  Ret = pIndex;.  
16cf0 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
16d00 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
16d10 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
16d20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
16d30 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
16d40 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
16d50 33 5f 66 72 65 65 28 70 49 6e 64 65 78 2d 3e 7a  3_free(pIndex->z
16d60 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  ColAff);.    sql
16d70 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16d80 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
16d90 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
16da0 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
16db0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
16dc0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
16dd0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
16de0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
16df0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
16e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
16e10 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
16e20 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
16e30 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
16e40 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
16e50 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
16e60 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
16e70 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
16e80 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
16e90 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
16ea0 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
16eb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
16ec0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
16ed0 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
16ee0 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
16ef0 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
16f00 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
16f10 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
16f20 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
16f30 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
16f40 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
16f50 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
16f60 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
16f70 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
16f80 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
16f90 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
16fa0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
16fb0 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
16fc0 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
16fd0 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69  cular combiniati
16fe0 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
16ff0 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
17000 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
17010 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
17020 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
17030 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
17040 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
17050 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
17060 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
17070 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
17080 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
17090 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
170a0 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
170b0 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
170c0 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
170d0 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
170e0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
170f0 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
17100 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
17110 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
17120 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
17130 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
17140 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
17150 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
17160 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
17170 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20    unsigned *a = 
17180 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  pIdx->aiRowEst;.
17190 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
171a0 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30  t( a!=0 );.  a[0
171b0 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66  ] = 1000000;.  f
171c0 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(i=pIdx->nColu
171d0 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a  mn; i>=5; i--){.
171e0 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20      a[i] = 5;.  
171f0 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20  }.  while( i>=1 
17200 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31  ){.    a[i] = 11
17210 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20   - i;.    i--;. 
17220 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
17230 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
17240 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e  ){.    a[pIdx->n
17250 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d  Column] = 1;.  }
17260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17270 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
17280 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
17290 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
172a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
172b0 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
172c0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
172d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
172e0 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
172f0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
17300 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
17310 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
17320 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
17330 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
17340 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
17350 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
17360 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
17370 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
17380 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
17390 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
173a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
173b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
173c0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
173d0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
173e0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
173f0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
17400 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
17410 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
17420 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
17430 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
17440 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
17450 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
17460 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
17470 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
17480 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
17490 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
174a0 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
174b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
174c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
174d0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
174e0 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
174f0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
17500 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
17510 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
17520 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
17530 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
17540 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
17550 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17560 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
17570 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
17580 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
17590 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
175a0 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
175b0 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
175c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
175d0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
175e0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
175f0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
17600 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
17610 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17620 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
17630 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
17640 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
17650 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
17660 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
17670 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
17680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
17690 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
176a0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
176b0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
176c0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
176d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
176e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
176f0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
17700 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
17710 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
17720 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
17730 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
17740 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29  _TEMPDB && iDb )
17750 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
17760 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
17770 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
17780 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17790 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
177a0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
177b0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
177c0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
177d0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
177e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
177f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
17800 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
17810 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
17820 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
17830 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
17840 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
17850 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
17860 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
17870 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
17880 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
17890 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
178a0 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
178b0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
178c0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
178d0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
178e0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
178f0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
17900 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
17910 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
17920 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17930 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
17940 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44  at1", db->aDb[iD
17950 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  b].zName) ){.   
17960 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
17970 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
17980 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
17990 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
179a0 74 31 20 57 48 45 52 45 20 69 64 78 3d 25 51 22  t1 WHERE idx=%Q"
179b0 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
179c0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49  b[iDb].zName, pI
179d0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
179e0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
179f0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
17a00 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
17a10 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
17a20 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
17a30 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
17a40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17a50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
17a60 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
17a70 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
17a80 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
17a90 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
17aa0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
17ab0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
17ac0 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
17ad0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
17ae0 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
17af0 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74  ts.  Each object
17b00 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
17b10 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
17b20 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73  s in size.  This
17b30 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
17b40 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65  es a new.** obje
17b50 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ct on the end of
17b60 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a   the array..**.*
17b70 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68  * *pnEntry is th
17b80 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
17b90 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75  ies already in u
17ba0 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73  se.  *pnAlloc is
17bb0 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
17bc0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a  ly allocated siz
17bd0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20  e of the array. 
17be0 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65   initSize is the
17bf0 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e  .** suggested in
17c00 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65  itial array size
17c10 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a   allocation..**.
17c20 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  ** The index of 
17c30 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
17c40 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49   returned in *pI
17c50 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  dx..**.** This r
17c60 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
17c70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17c80 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
17c90 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74  .  This.** might
17ca0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
17cb0 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61 6d  the pArray param
17cc0 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74  eter or it might
17cd0 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a   be a different.
17ce0 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68  ** pointer if th
17cf0 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73 69  e array was resi
17d00 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  zed..*/.void *sq
17d10 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
17d20 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
17d30 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
17d40 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
17d50 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
17d60 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
17d70 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
17d80 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
17d90 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
17da0 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
17db0 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
17dc0 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
17dd0 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
17de0 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a  */.  int initSiz
17df0 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73  e,     /* Sugges
17e00 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f  ted initial allo
17e10 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
17e20 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  nts */.  int *pn
17e30 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
17e40 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
17e50 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
17e60 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c   */.  int *pnAll
17e70 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65  oc,     /* Curre
17e80 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  nt size of the a
17e90 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
17ea0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
17eb0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
17ec0 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
17ed0 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
17ee0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
17ef0 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e   *z;.  if( *pnEn
17f00 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20  try >= *pnAlloc 
17f10 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
17f20 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  w;.    int newSi
17f30 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  ze;.    newSize 
17f40 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b  = (*pnAlloc)*2 +
17f50 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70   initSize;.    p
17f60 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
17f70 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61  ealloc(db, pArra
17f80 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
17f90 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
17fa0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
17fb0 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
17fc0 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
17fd0 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f     }.    *pnAllo
17fe0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
17ff0 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
18000 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20 70  )/szEntry;.    p
18010 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
18020 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
18030 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
18040 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a  &z[*pnEntry * sz
18050 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
18060 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a  ry);.  *pIdx = *
18070 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e  pnEntry;.  ++*pn
18080 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
18090 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
180a0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
180b0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
180c0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
180d0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
180e0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
180f0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
18100 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
18110 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
18120 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
18130 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
18140 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
18150 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
18160 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
18170 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
18180 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
18190 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
181a0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
181b0 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
181c0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
181d0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
181e0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
181f0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
18200 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
18210 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
18220 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
18230 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
18240 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
18250 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20  [0]),.      5,. 
18260 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
18270 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
18280 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69  nAlloc,.      &i
18290 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
182a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
182b0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
182c0 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
182d0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
182e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
182f0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
18300 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
18310 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
18320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
18330 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
18340 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
18350 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
18360 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
18370 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
18380 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
18390 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
183a0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
183b0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
183c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
183d0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
183e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
183f0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
18400 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
18410 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
18420 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18430 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
18440 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
18450 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
18460 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
18470 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
18480 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
18490 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
184a0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
184b0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
184c0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
184d0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
184e0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
184f0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
18500 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
18510 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
18520 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
18530 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
18540 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
18550 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
18560 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
18570 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
18580 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
18590 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
185a0 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
185b0 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
185c0 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
185d0 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
185e0 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
185f0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
18600 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
18610 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
18620 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
18630 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
18640 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
18650 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
18660 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
18670 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
18680 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
18690 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
186a0 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
186b0 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
186c0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
186d0 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
186e0 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
186f0 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
18700 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
18710 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
18720 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
18730 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
18740 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
18750 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
18760 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
18770 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
18780 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
18790 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
187a0 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
187b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
187c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
187d0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
187e0 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
187f0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
18800 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
18810 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
18820 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
18830 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
18840 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18850 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
18860 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
18870 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18880 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
18890 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
188a0 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
188b0 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
188c0 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
188d0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
188e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
188f0 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
18900 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
18910 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
18920 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18930 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
18940 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
18950 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
18960 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
18970 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
18980 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
18990 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
189a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
189b0 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
189c0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
189d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
189e0 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
189f0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
18a00 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
18a10 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
18a20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b   if( pSrc->nSrc+
18a30 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
18a40 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
18a50 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  st *pNew;.    in
18a60 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d  t nAlloc = pSrc-
18a70 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20  >nSrc+nExtra;.  
18a80 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20    int nGot;.    
18a90 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
18aa0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
18ab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18ac0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
18ad0 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
18ae0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
18af0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
18b00 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
18b10 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
18b20 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
18b30 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
18b40 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
18b50 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c  .    nGot = (sql
18b60 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
18b70 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a  (db, pNew) - siz
18b80 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65  eof(*pSrc))/size
18b90 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31  of(pSrc->a[0])+1
18ba0 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
18bb0 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a  oc = (u16)nGot;.
18bc0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
18bd0 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
18be0 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
18bf0 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
18c00 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
18c10 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
18c20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
18c30 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
18c40 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
18c50 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
18c60 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
18c70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31  Src->nSrc += (i1
18c80 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20  6)nExtra;..  /* 
18c90 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61  Zero the newly a
18ca0 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a  llocated slots *
18cb0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63  /.  memset(&pSrc
18cc0 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ->a[iStart], 0, 
18cd0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
18ce0 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f  ])*nExtra);.  fo
18cf0 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53  r(i=iStart; i<iS
18d00 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b  tart+nExtra; i++
18d10 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
18d20 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
18d30 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
18d40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18d50 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69  e enlarged SrcLi
18d60 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  st */.  return p
18d70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  Src;.}.../*.** A
18d80 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
18d90 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
18da0 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
18db0 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
18dc0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
18dd0 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
18de0 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
18df0 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
18e00 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e   pTable is NULL.
18e10 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74  .**.** A SrcList
18e20 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
18e30 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
18e40 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  s an OOM error. 
18e50 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   The returned.**
18e60 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62   SrcList might b
18e70 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
18e80 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77  e SrcList that w
18e90 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d  as input or it m
18ea0 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77  ight be.** a new
18eb0 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d   one.  If an OOM
18ec0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
18ed0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  rs, then the pri
18ee0 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73  or value of pLis
18ef0 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70  t.** that is inp
18f00 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
18f10 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  ne is automatica
18f20 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
18f30 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
18f40 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
18f50 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
18f60 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
18f70 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
18f80 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
18f90 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
18fa0 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
18fb0 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
18fc0 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
18fd0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
18fe0 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
18ff0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
19000 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
19010 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
19020 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
19030 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
19040 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
19050 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
19060 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
19070 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
19080 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
19090 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
190a0 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
190b0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
190c0 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
190d0 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
190e0 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
190f0 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
19100 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
19110 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
19120 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
19130 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19140 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
19150 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
19160 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
19170 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
19180 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
19190 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
191a0 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
191b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
191c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
191d0 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a  end(D,A,B,C);.**
191e0 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
191f0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
19200 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
19210 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69  se name.  If C i
19220 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65  s defined.** the
19230 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f  n so is B.  In o
19240 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e  ther words, we n
19250 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65  ever have a case
19260 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   where:.**.**   
19270 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19280 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30  ListAppend(D,A,0
19290 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20  ,C);.**.** Both 
192a0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
192b0 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64  base are assumed
192c0 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20   to be quoted.  
192d0 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65  They are dequote
192e0 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e  d.** before bein
192f0 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53  g added to the S
19300 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69  rcList..*/.SrcLi
19310 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
19320 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69  stAppend(.  sqli
19330 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
19340 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
19350 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
19360 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
19370 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
19380 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
19390 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e   this SrcList. N
193a0 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65  ULL creates a ne
193b0 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54  w SrcList */.  T
193c0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
193d0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61     /* Table to a
193e0 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ppend */.  Token
193f0 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f   *pDatabase    /
19400 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68  * Database of th
19410 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
19420 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19430 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
19440 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
19450 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
19460 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
19470 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
19480 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
19490 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
194a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
194b0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  ero(db, sizeof(S
194c0 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
194d0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
194e0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
194f0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
19500 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c   }.  pList = sql
19510 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
19520 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c  ge(db, pList, 1,
19530 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
19540 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19550 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
19560 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
19570 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
19580 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19590 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
195a0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
195b0 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
195c0 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
195d0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
195e0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
195f0 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
19600 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
19610 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
19620 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
19630 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
19640 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
19650 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
19660 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19670 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
19680 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
19690 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
196a0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
196b0 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  b, pDatabase);. 
196c0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
196d0 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
196e0 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
196f0 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
19700 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
19710 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
19720 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
19730 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
19740 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
19750 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
19760 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19770 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19780 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
19790 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
197a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
197b0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
197c0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
197d0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
197e0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
197f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
19800 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
19810 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
19820 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
19830 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
19840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
19850 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
19860 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19870 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
19880 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
19890 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
198a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
198b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
198c0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
198d0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
198e0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
198f0 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
19900 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
19910 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
19920 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
19930 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
19940 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19950 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
19960 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
19970 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
19980 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
19990 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
199a0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
199b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
199c0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
199d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
199e0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
199f0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
19a00 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
19a10 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
19a20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19a30 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  b, pItem->zIndex
19a40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
19a50 6c 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d  leteTable(pItem-
19a60 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
19a70 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
19a80 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  db, pItem->pSele
19a90 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
19aa0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
19ab0 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
19ac0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
19ad0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
19ae0 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
19af0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19b00 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
19b10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19b20 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
19b30 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
19b40 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
19b50 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
19b60 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
19b70 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
19b80 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
19b90 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
19ba0 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
19bb0 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
19bc0 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
19bd0 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
19be0 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
19bf0 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
19c00 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
19c10 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
19c20 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
19c30 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
19c40 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
19c50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
19c60 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
19c70 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
19c80 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
19c90 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
19ca0 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
19cb0 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
19cc0 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61   term has a alia
19cd0 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
19ce0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
19cf0 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
19d00 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
19d10 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
19d20 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
19d30 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
19d40 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
19d50 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
19d60 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
19d70 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
19d80 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
19d90 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
19da0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
19db0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
19dc0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
19dd0 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
19de0 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
19df0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
19e00 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
19e10 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
19e20 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
19e30 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
19e40 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
19e50 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
19e60 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
19e70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
19e80 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
19e90 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
19ea0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
19eb0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
19ec0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
19ed0 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
19ee0 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
19ef0 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
19f00 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19f10 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
19f20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19f30 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
19f40 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
19f50 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
19f60 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
19f70 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
19f80 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
19f90 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
19fa0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
19fb0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
19fc0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
19fd0 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
19fe0 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
19ff0 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1a000 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1a010 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1a020 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a030 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1a040 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1a050 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1a060 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1a070 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1a080 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1a090 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1a0a0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1a0b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1a0c0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1a0d0 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1a0e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a0f0 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1a100 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1a110 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1a120 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1a130 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1a140 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1a150 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1a160 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1a170 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1a180 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1a190 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1a1a0 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
1a1b0 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20  p->nSrc==0) ){. 
1a1c0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1a1d0 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1a1e0 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1a1f0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
1a200 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29  ert( pAlias!=0 )
1a210 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e  ;.  if( pAlias->
1a220 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
1a230 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
1a240 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1a250 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
1a260 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1a270 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
1a280 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
1a290 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
1a2a0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
1a2b0 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f  urn p;.. append_
1a2c0 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73  from_error:.  as
1a2d0 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
1a2e0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a2f0 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71  e(db, pOn);.  sq
1a300 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1a310 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
1a320 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1a330 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65  lete(db, pSubque
1a340 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ry);.  return 0;
1a350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1a360 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1a370 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1a380 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1a390 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1a3a0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1a3b0 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1a3c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1a3d0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1a3e0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1a3f0 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1a400 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1a410 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1a420 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65  dexedBy){.  asse
1a430 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d  rt( pIndexedBy!=
1a440 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0 );.  if( p && 
1a450 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30  ALWAYS(p->nSrc>0
1a460 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
1a470 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1a480 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1a490 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1a4a0 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e  rt( pItem->notIn
1a4b0 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74 65  dexed==0 && pIte
1a4c0 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  m->zIndex==0 );.
1a4d0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64      if( pIndexed
1a4e0 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e  By->n==1 && !pIn
1a4f0 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20  dexedBy->z ){.  
1a500 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e      /* A "NOT IN
1a510 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61  DEXED" clause wa
1a520 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20  s supplied. See 
1a530 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a  parse.y .      *
1a540 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64  * construct "ind
1a550 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65  exed_opt" for de
1a560 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1a570 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  pItem->notIndexe
1a580 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
1a590 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a  {.      pItem->z
1a5a0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 4e  Index = sqlite3N
1a5b0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
1a5c0 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
1a5d0 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dBy);.    }.  }.
1a5e0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75  }../*.** When bu
1a5f0 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d  ilding up a FROM
1a600 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70   clause in the p
1a610 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20  arser, the join 
1a620 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  operator.** is i
1a630 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65  nitially attache
1a640 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70  d to the left op
1a650 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20  erand.  But the 
1a660 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
1a670 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f  * expects the jo
1a680 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  in operator to b
1a690 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f  e on the right o
1a6a0 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
1a6b0 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20  utine.** Shifts 
1a6c0 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  all join operato
1a6d0 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  rs from left to 
1a6e0 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74  right for an ent
1a6f0 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75  ire FROM.** clau
1a700 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  se..**.** Exampl
1a710 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a  e: Suppose the j
1a720 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73  oin is like this
1a730 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1a740 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73    A natural cros
1a750 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54  s join B.**.** T
1a760 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22  he operator is "
1a770 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1a780 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20  in".  The A and 
1a790 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73  B operands are s
1a7a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61  tored.** in p->a
1a7b0 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c  [0] and p->a[1],
1a7c0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
1a7d0 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69  The parser initi
1a7e0 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a  ally stores the.
1a7f0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  ** operator with
1a800 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   A.  This routin
1a810 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70  e shifts that op
1a820 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42  erator over to B
1a830 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a840 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
1a850 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70  nType(SrcList *p
1a860 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
1a870 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  >a ){.    int i;
1a880 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
1a890 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
1a8a0 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a  .      p->a[i].j
1a8b0 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
1a8c0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  -1].jointype;.  
1a8d0 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
1a8e0 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1a8f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  }.}../*.** Begin
1a900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1a910 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1a920 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
1a930 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1a940 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
1a950 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1a960 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
1a970 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1a980 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1a990 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
1a9a0 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66   db!=0 );./*  if
1a9b0 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  ( db->aDb[0].pBt
1a9c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f  ==0 ) return; */
1a9d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1a9e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1a9f0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1aa00 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
1aa10 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1aa20 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1aa30 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1aa40 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1aa50 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
1aa60 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
1aa70 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1aa80 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1aa90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1aaa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
1aab0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
1aac0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1aad0 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
1aae0 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1aaf0 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
1ab00 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1ab10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1ab20 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
1ab30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1ab40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1ab50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
1ab60 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
1ab70 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1ab80 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1ab90 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
1aba0 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1abb0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1abc0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
1abd0 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64  !=0 );./*  if( d
1abe0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1abf0 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20   ) return; */.  
1ac00 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1ac10 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1ac20 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1ac30 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
1ac40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1ac50 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
1ac60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1ac70 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1ac80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ac90 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
1aca0 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
1acb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1acc0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
1acd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
1ace0 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
1acf0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1ad00 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1ad10 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
1ad20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1ad30 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
1ad40 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
1ad50 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69  ( db!=0 );./*  i
1ad60 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  f( db->aDb[0].pB
1ad70 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a  t==0 ) return; *
1ad80 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
1ad90 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1ada0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1adb0 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
1adc0 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1add0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1ade0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1adf0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1ae00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1ae10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1ae20 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
1ae30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1ae40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ae50 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1ae60 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72  rser when it par
1ae70 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ses a command to
1ae80 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65   create,.** rele
1ae90 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
1aea0 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74  an SQL savepoint
1aeb0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
1aec0 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73  e3Savepoint(Pars
1aed0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
1aee0 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  p, Token *pName)
1aef0 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
1af00 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1af10 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1af20 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
1af30 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64   zName ){.    Vd
1af40 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
1af50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1af60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1af70 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1af80 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  N.    static con
1af90 73 74 20 63 68 61 72 20 2a 61 7a 5b 5d 20 3d 20  st char *az[] = 
1afa0 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45  { "BEGIN", "RELE
1afb0 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ASE", "ROLLBACK"
1afc0 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1afd0 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  !SAVEPOINT_BEGIN
1afe0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   && SAVEPOINT_RE
1aff0 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45  LEASE==1 && SAVE
1b000 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d  POINT_ROLLBACK==
1b010 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  2 );.#endif.    
1b020 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65  if( !v || sqlite
1b030 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1b040 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e, SQLITE_SAVEPO
1b050 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61  INT, az[op], zNa
1b060 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  me, 0) ){.      
1b070 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1b080 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
1b090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1b0a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b0b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b0c0 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c  P_Savepoint, op,
1b0d0 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34   0, 0, zName, P4
1b0e0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1b0f0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1b100 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
1b110 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
1b120 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
1b130 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
1b140 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1b150 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
1b160 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
1b170 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1b180 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1b190 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1b1a0 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
1b1b0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
1b1c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1b1d0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
1b1e0 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
1b1f0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
1b200 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1b210 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
1b220 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
1b230 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1b240 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
1b250 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b260 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1b270 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1b280 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
1b290 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1b2a0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1b2b0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1b2c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1b2d0 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
1b2e0 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
1b2f0 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  (db, 0, 0, SQLIT
1b300 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
1b310 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20  SIZE, flags,.   
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
1b340 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a  b->aDb[1].pBt);.
1b350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1b370 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b380 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1b390 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
1b3a0 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
1b3b0 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
1b3c0 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
1b3d0 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
1b3e0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
1b3f0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
1b400 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
1b410 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20  ert( (db->flags 
1b420 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
1b430 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  )==0 || db->auto
1b440 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 61 73  Commit );.    as
1b450 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
1b460 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
1b470 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
1b480 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  nalMode(sqlite3B
1b490 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
1b4a0 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[1].pBt),.     
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4a         db->dfltJ
1b4d0 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a 20 20 7d  ournalMode);.  }
1b4e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1b4f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1b500 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
1b510 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
1b520 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20  hema cookie and 
1b530 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d  start.** a read-
1b540 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1b550 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61  all named databa
1b560 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  se files..**.** 
1b570 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
1b580 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20  that all schema 
1b590 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66  cookies be verif
1b5a0 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72  ied and all.** r
1b5b0 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ead transactions
1b5c0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1b5d0 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  re anything else
1b5e0 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74   happens in.** t
1b5f0 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
1b600 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
1b610 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
1b620 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65   after much othe
1b630 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65  r.** code has be
1b640 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53  en generated.  S
1b650 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77  o here is what w
1b660 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e do:.**.** The 
1b670 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
1b680 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1b690 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50  d, we code an OP
1b6a0 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69  _Goto that.** wi
1b6b0 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62  ll jump to a sub
1b6c0 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65  routine at the e
1b6d0 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  nd of the progra
1b6e0 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72  m.  Then we.** r
1b6f0 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61  ecord every data
1b700 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20  base that needs 
1b710 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66  its schema verif
1b720 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50  ied in the.** pP
1b730 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1b740 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20   field.  Later, 
1b750 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20  after all other 
1b760 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a  code has been.**
1b770 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20   generated, the 
1b780 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1b790 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  does the cookie 
1b7a0 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e  verifications an
1b7b0 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20  d.** starts the 
1b7c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c  transactions wil
1b7d0 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74  l be coded and t
1b7e0 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61  he OP_Goto P2 va
1b7f0 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d  lue.** will be m
1b800 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
1b810 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  that subroutine.
1b820 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e    The generation
1b830 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69   of the.** cooki
1b840 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73  e verification s
1b850 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68  ubroutine code h
1b860 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65  appens in sqlite
1b870 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
1b880 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20  .**.** If iDb<0 
1b890 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50  then code the OP
1b8a0 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e  _Goto only - don
1b8b0 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76  't set flag to v
1b8c0 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68  erify the.** sch
1b8d0 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62  ema on any datab
1b8e0 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ases.  This can 
1b8f0 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  be used to posit
1b900 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a  ion the OP_Goto.
1b910 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20  ** early in the 
1b920 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20  code, before we 
1b930 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61  know if any data
1b940 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c  base tables will
1b950 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   be used..*/.voi
1b960 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
1b970 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
1b980 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
1b990 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1b9a0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1b9b0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1b9c0 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 6f  rse);..  if( pTo
1b9d0 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f  plevel->cookieGo
1b9e0 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  to==0 ){.    Vdb
1b9f0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1ba00 74 56 64 62 65 28 70 54 6f 70 6c 65 76 65 6c 29  tVdbe(pToplevel)
1ba10 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
1ba20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69   return;  /* Thi
1ba30 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
1ba40 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72  f there was a pr
1ba50 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  ior error */.   
1ba60 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1ba70 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
1ba80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ba90 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a  _Goto, 0, 0)+1;.
1baa0 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30    }.  if( iDb>=0
1bab0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
1bac0 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  *db = pToplevel-
1bad0 3e 64 62 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73  >db;.    int mas
1bae0 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  k;..    assert( 
1baf0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
1bb00 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
1bb10 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
1bb20 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  | iDb==1 );.    
1bb30 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
1bb40 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
1bb50 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  2 );.    mask = 
1bb60 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20  1<<iDb;.    if( 
1bb70 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
1bb80 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
1bb90 30 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c  0 ){.      pTopl
1bba0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
1bbb0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1bbc0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1bbd0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
1bbe0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1bbf0 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
1bc00 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e;.      if( !OM
1bc10 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1bc20 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
1bc30 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
1bc40 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c  tabase(pToplevel
1bc50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bc60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1bc70 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1bc80 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1bc90 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1bca0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1bcb0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1bcc0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1bcd0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1bce0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1bcf0 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1bd00 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1bd10 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1bd20 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1bd30 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1bd40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1bd50 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1bd60 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1bd70 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1bd80 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1bd90 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1bda0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1bdb0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1bdc0 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1bdd0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1bde0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1bdf0 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1be00 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1be10 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1be20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1be30 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1be40 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1be50 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1be60 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1be70 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1be80 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1be90 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1bea0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1beb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1bec0 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1bed0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1bee0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1bef0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1bf00 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1bf10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1bf20 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1bf30 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1bf40 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
1bf50 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
1bf60 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1bf70 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1bf80 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1bf90 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
1bfa0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1bfb0 65 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  e, iDb);.  pTopl
1bfc0 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 20  evel->writeMask 
1bfd0 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 70 54 6f  |= 1<<iDb;.  pTo
1bfe0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1bff0 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
1c000 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ment;.}../* .** 
1c010 53 65 74 20 74 68 65 20 22 6d 61 79 20 74 68 72  Set the "may thr
1c020 6f 77 20 61 62 6f 72 74 20 65 78 63 65 70 74 69  ow abort excepti
1c030 6f 6e 22 20 66 6c 61 67 20 66 6f 72 20 74 68 65  on" flag for the
1c040 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
1c050 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 63  ntly .** being c
1c060 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
1c070 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
1c080 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1c090 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1c0a0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1c0b0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1c0c0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
1c0d0 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
1c0e0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
1c0f0 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
1c100 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
1c110 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
1c120 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
1c130 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
1c140 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
1c150 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
1c160 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
1c170 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
1c180 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1c190 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1c1a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c1b0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1c1c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c1d0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 63 68 61 72  nt onError, char
1c1e0 20 2a 70 34 2c 20 69 6e 74 20 70 34 74 79 70 65   *p4, int p4type
1c1f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
1c200 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1c210 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6f 6e 45  arse);.  if( onE
1c220 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
1c230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
1c240 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
1c250 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1c260 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
1c270 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
1c280 41 49 4e 54 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  AINT, onError, 0
1c290 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 7d  , p4, p4type);.}
1c2a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
1c2b0 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
1c2c0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
1c2d0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1c2e0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
1c2f0 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
1c300 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
1c310 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
1c320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1c330 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
1c340 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
1c350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1c360 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
1c370 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
1c380 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
1c390 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1c3a0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
1c3b0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1c3c0 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
1c3d0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1c3e0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
1c3f0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
1c400 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
1c410 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  oll) ){.      re
1c420 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1c430 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1c440 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1c450 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1c460 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
1c470 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
1c480 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1c490 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
1c4a0 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
1c4b0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1c4c0 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
1c4d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1c4e0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
1c4f0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
1c500 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
1c510 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
1c520 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
1c530 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1c540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1c550 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1c560 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1c570 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
1c580 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
1c590 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
1c5a0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
1c5b0 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
1c5c0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
1c5d0 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
1c5e0 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
1c5f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1c600 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
1c610 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
1c620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
1c630 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1c640 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
1c650 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c660 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1c670 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1c680 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1c690 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1c6a0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1c6b0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
1c6c0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
1c6d0 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
1c6e0 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
1c6f0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1c700 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
1c710 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
1c720 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
1c730 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
1c740 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c750 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1c760 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
1c770 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
1c780 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
1c790 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
1c7a0 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
1c7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1c7c0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1c7d0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7f0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1c800 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
1c810 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1c820 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
1c830 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1c840 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
1c850 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
1c860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1c870 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
1c880 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
1c890 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c8b0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
1c8c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
1c8d0 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
1c8e0 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
1c8f0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
1c900 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c910 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
1c920 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
1c930 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
1c940 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
1c950 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
1c960 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
1c970 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
1c980 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
1c990 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
1c9a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
1c9b0 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
1c9c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1c9d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1c9e0 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
1c9f0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
1ca00 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
1ca30 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
1ca40 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
1ca50 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
1ca60 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1ca70 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
1ca80 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
1ca90 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1caa0 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
1cab0 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
1cac0 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
1cad0 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
1cae0 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
1caf0 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
1cb00 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
1cb10 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
1cb20 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1cb30 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
1cb40 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
1cb50 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
1cb60 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
1cb70 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
1cb80 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
1cb90 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
1cba0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1cbb0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
1cbc0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1cbd0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
1cbe0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
1cbf0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1cc00 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
1cc10 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
1cc20 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1cc30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1cc40 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
1cc50 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
1cc60 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
1cc70 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cc90 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
1cca0 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
1ccb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ccd0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1cce0 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
1ccf0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
1cd00 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
1cd10 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1cd20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
1cd30 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1cd40 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
1cd50 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
1cd60 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1cd90 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
1cda0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1cdb0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1cdc0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1cdd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1cde0 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
1cdf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ce00 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1ce10 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
1ce20 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
1ce30 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
1ce40 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
1ce50 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1ce60 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1ce70 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
1ce80 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
1ce90 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
1cea0 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
1ceb0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1cec0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1ced0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1cee0 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
1cef0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
1cf00 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
1cf10 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
1cf20 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
1cf30 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
1cf40 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
1cf50 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
1cf60 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
1cf70 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
1cf80 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
1cf90 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1cfa0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
1cfb0 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
1cfc0 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
1cfd0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1cfe0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
1cff0 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
1d000 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1d010 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
1d020 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
1d030 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
1d040 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d050 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
1d060 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1d070 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d080 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
1d090 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1d0a0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
1d0b0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
1d0c0 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
1d0d0 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
1d0e0 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
1d0f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1d100 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
1d110 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
1d120 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
1d130 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1d140 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
1d150 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
1d160 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
1d170 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
1d180 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
1d190 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
1d1a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d1b0 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
1d1c0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1d1d0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1d1e0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
1d1f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d200 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   z);.  if( pInde
1d210 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
1d220 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1d230 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
1d240 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1d250 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1d260 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1d270 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1d280 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
1d290 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1d2a0 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
1d2b0 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
1d2c0 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
1d2d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1d2e0 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20  urn a dynamicly 
1d2f0 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66  allocated KeyInf
1d300 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
1d310 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
1d320 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64  with OP_OpenRead
1d330 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65   or OP_OpenWrite
1d340 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62   to access datab
1d350 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  ase index pIdx..
1d360 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1d370 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  ful, a pointer t
1d380 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74  o the new struct
1d390 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ure is returned.
1d3a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
1d3b0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1d3c0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1d3d0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44 62  alling sqlite3Db
1d3e0 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74 68  Free(db, ) on th
1d3f0 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70  e returned .** p
1d400 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72  ointer. If an er
1d410 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20  ror occurs (out 
1d420 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73  of memory or mis
1d430 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  sing collation .
1d440 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55  ** sequence), NU
1d450 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
1d460 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  nd the state of 
1d470 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74  pParse updated t
1d480 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65  o reflect.** the
1d490 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e   error..*/.KeyIn
1d4a0 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78  fo *sqlite3Index
1d4b0 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70  Keyinfo(Parse *p
1d4c0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
1d4d0 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
1d4e0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
1d4f0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
1d500 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28  nBytes = sizeof(
1d510 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c  KeyInfo) + (nCol
1d520 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  -1)*sizeof(CollS
1d530 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73  eq*) + nCol;.  s
1d540 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d550 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
1d560 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49  fo *pKey = (KeyI
1d570 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  nfo *)sqlite3DbM
1d580 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
1d590 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b  ytes);..  if( pK
1d5a0 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e  ey ){.    pKey->
1d5b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d5c0 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74  .    pKey->aSort
1d5d0 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28  Order = (u8 *)&(
1d5e0 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c  pKey->aColl[nCol
1d5f0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1d600 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65  &pKey->aSortOrde
1d610 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20  r[nCol]==&(((u8 
1d620 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29  *)pKey)[nBytes])
1d630 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
1d640 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
1d650 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c       char *zColl
1d660 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
1d670 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  i];.      assert
1d680 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ( zColl );.     
1d690 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
1d6a0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
1d6b0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
1d6c0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65  Coll);.      pKe
1d6d0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
1d6e0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
1d6f0 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[i];.    }.  
1d700 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d    pKey->nField =
1d710 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a   (u16)nCol;.  }.
1d720 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1d730 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
1d740 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65  e3DbFree(db, pKe
1d750 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30  y);.    pKey = 0
1d760 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1d770 4b 65 79 3b 0a 7d 0a                             Key;.}.