/ Hex Artifact Content
Login

Artifact c6c8d4ce8c0a464bb25d0c3bfdb27834ad16d902:


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 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
117e0 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
117f0 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
11800 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
11810 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
11820 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
11830 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
11840 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
11850 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
11860 6f 6e 20 2a 2f 0a 0a 20 20 70 4e 65 78 74 54 6f  on */..  pNextTo
11870 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74   = (FKey *)sqlit
11880 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
11890 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61  >pSchema->fkeyHa
118a0 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79  sh, .      pFKey
118b0 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74  ->zTo, sqlite3St
118c0 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54  rlen30(pFKey->zT
118d0 6f 29 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  o), (void *)pFKe
118e0 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
118f0 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
11900 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
11910 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  led = 1;.    got
11920 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
11930 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20  if( pNextTo ){. 
11940 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74     assert( pNext
11950 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29  To->pPrevTo==0 )
11960 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65  ;.    pFKey->pNe
11970 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a  xtTo = pNextTo;.
11980 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72      pNextTo->pPr
11990 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20  evTo = pFKey;.  
119a0 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
119b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
119c0 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
119d0 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
119e0 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
119f0 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
11a00 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
11a10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11a20 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
11a30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11a40 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
11a50 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
11a60 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
11a70 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
11a80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11a90 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
11aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11ab0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11ac0 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
11ad0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
11ae0 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
11af0 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
11b00 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
11b10 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
11b20 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
11b30 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
11b40 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
11b50 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
11b60 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
11b70 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
11b80 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
11b90 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
11ba0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
11bb0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
11bc0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
11bd0 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
11be0 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
11bf0 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
11c00 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
11c10 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
11c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11c30 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
11c40 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
11c50 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
11c60 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
11c70 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
11c80 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
11c90 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11ca0 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
11cb0 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
11cc0 72 72 65 64 3d 3d 31 20 29 3b 0a 20 20 70 46 4b  rred==1 );.  pFK
11cd0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
11ce0 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b   (u8)isDeferred;
11cf0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
11d00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11d10 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
11d20 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
11d30 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
11d40 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
11d50 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
11d60 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
11d70 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
11d80 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
11d90 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
11da0 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
11db0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
11dc0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
11dd0 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
11de0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
11df0 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
11e00 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
11e10 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
11e20 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
11e30 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
11e40 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
11e50 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
11e60 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
11e70 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
11e80 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
11e90 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11ea0 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
11eb0 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
11ec0 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
11ed0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
11ee0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
11ef0 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
11f00 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
11f10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
11f20 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
11f30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11f40 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
11f50 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
11f60 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
11f70 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
11f80 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
11f90 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
11fa0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
11fb0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
11fc0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
11fd0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
11fe0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
11ff0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12000 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
12010 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
12020 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ndex */.  int ad
12030 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
12040 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12050 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
12060 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  op */.  int tnum
12070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12080 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
12090 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
120a0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
120d0 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
120e0 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
120f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
12120 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
12130 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20 20  gIdxKey;        
12140 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
12150 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67  sters containing
12160 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 2a   the index key *
12170 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
12180 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
12190 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
121a0 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65  olding assemblie
121b0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
121c0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
121d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
121e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
121f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
12200 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
12210 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12220 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
12230 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
12240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12250 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
12260 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
12270 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
12280 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
12290 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
122a0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
122b0 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
122c0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
122d0 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
122e0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
122f0 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
12300 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
12310 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
12320 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
12330 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
12340 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
12350 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
12360 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12370 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
12380 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
12390 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
123a0 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
123b0 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
123c0 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
123d0 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  x->tnum;.    sql
123e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
123f0 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
12400 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b  , iDb);.  }.  pK
12410 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
12420 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
12430 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
12440 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12450 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
12460 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
12470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12480 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
12490 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
124a0 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d 65  NDOFF);.  if( me
124b0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
124c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
124d0 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
124e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e   }.  sqlite3Open
124f0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
12500 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
12510 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
12520 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
12530 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12540 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
12550 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
12560 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12570 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 49  (pParse);.  regI
12580 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47  dxKey = sqlite3G
12590 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
125a0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
125b0 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c  iTab, regRecord,
125c0 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   1);.  if( pInde
125d0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
125e0 6f 6e 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  one ){.    const
125f0 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
12600 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e 64  regIdxKey + pInd
12610 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
12620 20 63 6f 6e 73 74 20 69 6e 74 20 6a 32 20 3d 20   const int j2 = 
12630 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12640 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20  ntAddr(v) + 2;. 
12650 20 20 20 76 6f 69 64 20 2a 20 63 6f 6e 73 74 20     void * const 
12660 70 52 65 67 4b 65 79 20 3d 20 53 51 4c 49 54 45  pRegKey = SQLITE
12670 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67 49  _INT_TO_PTR(regI
12680 64 78 4b 65 79 29 3b 0a 0a 20 20 20 20 2f 2a 20  dxKey);..    /* 
12690 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61 63  The registers ac
126a0 63 65 73 73 65 64 20 62 79 20 74 68 65 20 4f 50  cessed by the OP
126b0 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65  _IsUnique opcode
126c0 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65 64 0a   were allocated.
126d0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c      ** using sql
126e0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
126f0 28 29 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  () inside of the
12700 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
12710 49 6e 64 65 78 4b 65 79 28 29 0a 20 20 20 20 2a  IndexKey().    *
12720 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 4a 75  * call above. Ju
12730 73 74 20 62 65 66 6f 72 65 20 74 68 61 74 20 66  st before that f
12740 75 6e 63 74 69 6f 6e 20 77 61 73 20 66 72 65 65  unction was free
12750 64 20 74 68 65 79 20 77 65 72 65 20 72 65 6c 65  d they were rele
12760 61 73 65 64 0a 20 20 20 20 2a 2a 20 28 6d 61 64  ased.    ** (mad
12770 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
12780 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20  he compiler for 
12790 72 65 75 73 65 29 20 75 73 69 6e 67 20 0a 20 20  reuse) using .  
127a0 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 6c 65    ** sqlite3Rele
127b0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 29 2e 20  aseTempRange(). 
127c0 53 6f 20 69 6e 20 73 6f 6d 65 20 77 61 79 73 20  So in some ways 
127d0 68 61 76 69 6e 67 20 74 68 65 20 4f 50 5f 49 73  having the OP_Is
127e0 55 6e 69 71 75 65 0a 20 20 20 20 2a 2a 20 6f 70  Unique.    ** op
127f0 63 6f 64 65 20 75 73 65 20 74 68 65 20 76 61 6c  code use the val
12800 75 65 73 20 73 74 6f 72 65 64 20 77 69 74 68 69  ues stored withi
12810 6e 20 73 65 65 6d 73 20 64 61 6e 67 65 72 6f 75  n seems dangerou
12820 73 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  s. However, sinc
12830 65 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 20  e.    ** we can 
12840 62 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 20  be sure that no 
12850 6f 74 68 65 72 20 74 65 6d 70 20 72 65 67 69 73  other temp regis
12860 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
12870 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
12880 73 69 6e 63 65 20 73 71 6c 69 74 65 33 52 65 6c  since sqlite3Rel
12890 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 29 20  easeTempRange() 
128a0 77 61 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  was called, it i
128b0 73 20 73 61 66 65 20 74 6f 20 64 6f 20 73 6f 2e  s safe to do so.
128c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
128d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
128e0 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49   OP_IsUnique, iI
128f0 64 78 2c 20 6a 32 2c 20 72 65 67 52 6f 77 69 64  dx, j2, regRowid
12900 2c 20 70 52 65 67 4b 65 79 2c 20 50 34 5f 49 4e  , pRegKey, P4_IN
12910 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T32);.    sqlite
12920 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
12930 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
12940 20 4f 45 5f 41 62 6f 72 74 2c 20 22 69 6e 64 65   OE_Abort, "inde
12950 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
12960 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 34 5f  not unique", P4_
12970 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73  STATIC);.  }.  s
12980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12990 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
129a0 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72  , iIdx, regRecor
129b0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
129c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
129d0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
129e0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
129f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
12a00 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
12a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
12a30 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a  iTab, addr1+1);.
12a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12a50 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
12a60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12a70 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
12a80 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
12a90 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12aa0 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
12ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
12ac0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
12ad0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
12ae0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
12af0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12b00 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
12b10 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
12b20 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
12b30 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
12b40 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
12b50 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
12b60 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
12b70 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
12b80 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
12b90 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
12ba0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
12bb0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
12bc0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
12bd0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
12be0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
12bf0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
12c00 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
12c10 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
12c20 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
12c30 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
12c40 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
12c50 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
12c60 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
12c70 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
12c80 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
12c90 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
12ca0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
12cb0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
12cc0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
12cd0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
12ce0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
12cf0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
12d00 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
12d10 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
12d20 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
12d30 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
12d40 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
12d50 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
12d60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12d70 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
12d80 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
12d90 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
12da0 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
12db0 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
12dc0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
12dd0 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
12de0 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d  ndex.autoIndex==
12df0 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  2)..*/.Index *sq
12e00 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
12e10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12e20 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
12e30 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
12e40 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
12e50 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
12e60 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
12e70 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
12e80 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
12e90 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
12ea0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
12eb0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
12ec0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
12ed0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
12ee0 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
12ef0 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
12f00 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
12f10 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
12f20 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
12f30 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
12f40 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
12f50 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
12f60 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
12f70 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
12f80 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
12f90 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
12fa0 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
12fb0 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
12fc0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
12fd0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
12fe0 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
12ff0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
13000 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
13010 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13020 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
13030 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
13040 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
13050 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
13060 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
13070 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
13080 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
13090 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
130a0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
130b0 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d  .  Index *pRet =
130c0 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74   0;     /* Point
130d0 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  er to return */.
130e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
130f0 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
13100 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
13110 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
13120 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
13130 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
13140 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
13150 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
13160 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
13170 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
13180 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
13190 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
131a0 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
131b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
131c0 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20  ken nullId;     
131d0 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
131e0 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
131f0 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78   list */.  DbFix
13200 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
13210 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
13220 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
13230 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
13240 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
13250 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
13260 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
13270 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
13280 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13290 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
132a0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
132b0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
132c0 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
132d0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
132e0 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
132f0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
13300 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
13320 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
13330 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
13340 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
13350 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
13360 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
13370 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
13380 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
13390 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
133a0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
133b0 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
133c0 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45  t nCol;.  int nE
133d0 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72  xtra = 0;.  char
133e0 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 61 73 73   *zExtra;..  ass
133f0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 7c  ert( pStart==0 |
13400 7c 20 70 45 6e 64 21 3d 30 20 29 3b 20 2f 2a 20  | pEnd!=0 ); /* 
13410 70 45 6e 64 20 6d 75 73 74 20 62 65 20 6e 6f 6e  pEnd must be non
13420 2d 4e 55 4c 4c 20 69 66 20 70 53 74 61 72 74 20  -NULL if pStart 
13430 69 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  is */.  assert( 
13440 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
13450 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76 65 72  );      /* Never
13460 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
13470 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
13480 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
13490 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  led || IN_DECLAR
134a0 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f  E_VTAB ){.    go
134b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
134c0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
134d0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
134e0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
134f0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
13500 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13510 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
13520 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
13530 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
13540 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
13550 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
13560 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
13570 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
13580 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
13590 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
135a0 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
135b0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
135c0 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
135d0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
135e0 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
135f0 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
13600 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
13610 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
13620 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
13630 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
13640 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
13650 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
13660 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
13670 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
13680 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
13690 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
136a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
136b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
136c0 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
136d0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
136e0 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
136f0 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
13700 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
13710 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
13720 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
13730 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
13740 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
13750 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
13760 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
13770 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
13780 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
13790 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
137a0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
137b0 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
137c0 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
137d0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
137e0 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
137f0 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
13800 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
13810 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
13820 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
13830 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
13840 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
13850 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
13860 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
13870 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20  ", pName) &&.   
13880 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53       sqlite3FixS
13890 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
138a0 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20  blName).    ){. 
138b0 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
138c0 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74  the parser const
138d0 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66  ructs pTblName f
138e0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65  rom a single ide
138f0 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a  ntifier,.      *
13900 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
13910 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ist can never fa
13920 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  il. */.      ass
13930 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
13940 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
13950 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
13960 73 65 2c 20 30 2c 20 70 54 62 6c 4e 61 6d 65 2d  se, 0, pTblName-
13970 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  >a[0].zName, .  
13980 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e        pTblName->
13990 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
139a0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 7c  .    if( !pTab |
139b0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
139c0 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
139d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
139e0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
139f0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70  [iDb].pSchema==p
13a00 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
13a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
13a20 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
13a30 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
13a40 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
13a50 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
13a60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13a70 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
13a80 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13a90 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
13aa0 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
13ab0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
13ac0 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
13ad0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
13ae0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
13af0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
13b00 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
13b10 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
13b20 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
13b30 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 26 70      && memcmp(&p
13b40 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
13b50 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
13b60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13b70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13b80 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
13b90 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
13ba0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
13bb0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13bc0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
13bd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13be0 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
13bf0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
13c00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13c10 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
13c20 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
13c30 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
13c40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13c50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
13c60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13c70 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
13c80 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13c90 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
13ca0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13cb0 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
13cc0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
13cd0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
13ce0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13cf0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
13d00 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
13d10 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
13d20 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
13d30 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
13d40 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
13d50 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
13d60 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
13d70 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
13d80 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
13d90 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
13da0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
13db0 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
13dc0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
13dd0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
13de0 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
13df0 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
13e00 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
13e10 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
13e20 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
13e30 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
13e40 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
13e50 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
13e60 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
13e70 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
13e80 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
13e90 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
13ea0 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
13eb0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
13ec0 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
13ed0 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
13ee0 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
13ef0 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
13f00 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
13f10 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
13f20 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
13f30 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
13f40 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
13f50 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
13f60 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
13f70 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
13f80 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13f90 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13fa0 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
13fb0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
13fc0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
13fd0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13fe0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
13ff0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
14000 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sy ){.      if( 
14010 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
14020 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
14030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
14040 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14050 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
14060 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
14070 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
14080 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
14090 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
140a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
140b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
140c0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
140d0 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21  me, pDb->zName)!
140e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
140f0 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
14100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14110 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14120 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
14130 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
14140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14150 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14160 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14170 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
14180 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
14190 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
141a0 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
141b0 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
141c0 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
141d0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65  n++){}.    zName
141e0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
141f0 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75  f(db, "sqlite_au
14200 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20  toindex_%s_%d", 
14210 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b  pTab->zName, n);
14220 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
14230 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
14240 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14250 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
14260 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
14270 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
14280 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
14290 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
142a0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
142b0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
142c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
142d0 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  pDb->zName;.    
142e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
142f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
14300 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
14310 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
14320 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
14330 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14340 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14350 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
14360 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
14370 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14380 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
14390 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
143a0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
143b0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
143c0 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
143d0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
143e0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
143f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14400 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14410 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
14420 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
14430 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
14440 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
14450 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
14460 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
14470 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
14480 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
14490 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
144a0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
144b0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
144c0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
144d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
144e0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
144f0 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  llId.z = pTab->a
14500 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
14510 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
14520 6c 49 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  lId.n = sqlite3S
14530 74 72 6c 65 6e 33 30 28 28 63 68 61 72 2a 29 6e  trlen30((char*)n
14540 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
14550 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
14560 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
14570 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  se, 0, 0);.    i
14580 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
14590 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
145a0 6e 64 65 78 3b 0a 20 20 20 20 73 71 6c 69 74 65  ndex;.    sqlite
145b0 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
145c0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
145d0 26 6e 75 6c 6c 49 64 2c 20 30 29 3b 0a 20 20 20  &nullId, 0);.   
145e0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
145f0 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72  tOrder = (u8)sor
14600 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
14610 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
14620 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73   many bytes of s
14630 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65  pace are require
14640 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69  d to store expli
14650 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69  citly.  ** speci
14660 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  fied collation s
14670 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20  equence names.. 
14680 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
14690 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
146a0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
146b0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
146c0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
146d0 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ( pExpr ){.     
146e0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
146f0 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
14700 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20        /* Either 
14710 70 43 6f 6c 6c 21 3d 30 20 6f 72 20 74 68 65 72  pColl!=0 or ther
14720 65 20 77 61 73 20 61 6e 20 4f 4f 4d 20 66 61 69  e was an OOM fai
14730 6c 75 72 65 2e 20 20 42 75 74 20 69 66 20 61 6e  lure.  But if an
14740 20 4f 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 66 61   OOM.      ** fa
14750 69 6c 75 72 65 20 77 65 20 68 61 76 65 20 71 75  ilure we have qu
14760 69 74 20 62 65 66 6f 72 65 20 72 65 61 63 68 69  it before reachi
14770 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a  ng this point. *
14780 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
14790 59 53 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  YS(pColl) ){.   
147a0 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28       nExtra += (
147b0 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 + sqlite3Strle
147c0 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  n30(pColl->zName
147d0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
147e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
147f0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
14800 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
14810 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
14820 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14830 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d  zName);.  nCol =
14840 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
14850 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
14860 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
14870 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
14880 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20 20  Index) +        
14890 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
148a0 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
148b0 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e     sizeof(int)*n
148c0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
148d0 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
148e0 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  n   */.      siz
148f0 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31  eof(int)*(nCol+1
14900 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ) +       /* Ind
14910 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f  ex.aiRowEst   */
14920 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68  .      sizeof(ch
14930 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  ar *)*nCol +    
14940 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
14950 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
14960 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
14970 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
14980 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
14990 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65  r */.      nName
149a0 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
149b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
149c0 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20  .zName      */. 
149d0 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20 20       nExtra     
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
14a00 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f  equence names */
14a10 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
14a20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14a30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14a40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
14a50 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
14a60 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e   = (char**)(&pIn
14a70 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65  dex[1]);.  pInde
14a80 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
14a90 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  nt *)(&pIndex->a
14aa0 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  zColl[nCol]);.  
14ab0 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
14ac0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28   = (unsigned *)(
14ad0 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
14ae0 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  n[nCol]);.  pInd
14af0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ex->aSortOrder =
14b00 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d   (u8 *)(&pIndex-
14b10 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31  >aiRowEst[nCol+1
14b20 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  ]);.  pIndex->zN
14b30 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26  ame = (char *)(&
14b40 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
14b50 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78  er[nCol]);.  zEx
14b60 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26  tra = (char *)(&
14b70 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e  pIndex->zName[nN
14b80 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70  ame+1]);.  memcp
14b90 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
14ba0 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
14bb0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
14bc0 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
14bd0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
14be0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
14bf0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
14c00 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
14c10 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
14c20 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d  x = (u8)(pName==
14c30 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  0);.  pIndex->pS
14c40 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
14c50 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20  iDb].pSchema;.. 
14c60 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
14c70 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
14c80 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
14c90 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
14ca0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
14cb0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
14cc0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
14cd0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
14ce0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
14cf0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
14d00 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
14d10 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
14d20 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
14d30 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  }..  /* Scan the
14d40 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
14d50 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
14d60 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
14d70 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
14d80 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
14d90 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
14da0 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
14db0 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
14dc0 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
14dd0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
14de0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 20 41  **.  ** TODO:  A
14df0 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d 61 6b  dd a test to mak
14e00 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
14e10 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  same column is n
14e20 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f  ot named.  ** mo
14e30 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74  re than once wit
14e40 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64  hin the same ind
14e50 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69  ex.  Only the fi
14e60 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a  rst instance of.
14e70 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20    ** the column 
14e80 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65  will ever be use
14e90 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
14ea0 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75  er.  Note that u
14eb0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 61  sing the.  ** sa
14ec0 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74  me column more t
14ed0 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20  han once cannot 
14ee0 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  be an error beca
14ef0 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a  use that would .
14f00 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77    ** break backw
14f10 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
14f20 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f  ty - it needs to
14f30 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20   be a warning.. 
14f40 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
14f50 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  ListItem=pList->
14f60 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  a; i<pList->nExp
14f70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65  r; i++, pListIte
14f80 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  m++){.    const 
14f90 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d  char *zColName =
14fa0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d   pListItem->zNam
14fb0 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70  e;.    Column *p
14fc0 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  TabCol;.    int 
14fd0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
14fe0 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
14ff0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
15000 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
15010 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
15020 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
15030 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
15040 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
15050 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
15060 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
15070 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
15080 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
15090 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
150a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
150b0 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
150c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
150d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
150e0 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
150f0 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
15100 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
15110 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
15120 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
15130 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15140 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
15150 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
15160 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a 20 4a 75 73   = j;.    /* Jus
15170 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 74 68  tification of th
15180 65 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74  e ALWAYS(pListIt
15190 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
151a0 29 3a 20 20 42 65 63 61 75 73 65 20 6f 66 0a 20  ):  Because of. 
151b0 20 20 20 2a 2a 20 74 68 65 20 77 61 79 20 74 68     ** the way th
151c0 65 20 22 69 64 78 6c 69 73 74 22 20 6e 6f 6e 2d  e "idxlist" non-
151d0 74 65 72 6d 69 6e 61 6c 20 69 73 20 63 6f 6e 73  terminal is cons
151e0 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
151f0 61 72 73 65 72 2c 0a 20 20 20 20 2a 2a 20 69 66  arser,.    ** if
15200 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
15210 72 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68  r is not null th
15220 65 6e 20 65 69 74 68 65 72 20 70 4c 69 73 74 49  en either pListI
15230 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
15240 6c 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 65 78  l.    ** must ex
15250 69 73 74 20 6f 72 20 65 6c 73 65 20 74 68 65 72  ist or else ther
15260 65 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  e must have been
15270 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
15280 42 75 74 20 69 66 20 74 68 65 72 65 0a 20 20 20  But if there.   
15290 20 2a 2a 20 77 61 73 20 61 6e 20 4f 4f 4d 20 65   ** was an OOM e
152a0 72 72 6f 72 2c 20 77 65 20 77 6f 75 6c 64 20 6e  rror, we would n
152b0 65 76 65 72 20 72 65 61 63 68 20 74 68 69 73 20  ever reach this 
152c0 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66  point. */.    if
152d0 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
152e0 70 72 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69  pr && ALWAYS(pLi
152f0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
15300 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  Coll) ){.      i
15310 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
15320 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
15330 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d  m->pExpr->pColl-
15340 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43  >zName;.      nC
15350 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
15360 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31  len30(zColl) + 1
15370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15380 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b  nExtra>=nColl );
15390 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  .      memcpy(zE
153a0 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f  xtra, zColl, nCo
153b0 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ll);.      zColl
153c0 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
153d0 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c   zExtra += nColl
153e0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d  ;.      nExtra -
153f0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  = nColl;.    }el
15400 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  se{.      zColl 
15410 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
15420 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28  zColl;.      if(
15430 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !zColl ){.     
15440 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     zColl = db->p
15450 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b  DfltColl->zName;
15460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15470 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
15480 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
15490 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
154a0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
154b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
154c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
154d0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
154e0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
154f0 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
15500 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
15510 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
15520 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
15530 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
15540 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
15550 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
15560 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c  Order;.  }.  sql
15570 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
15580 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  t(pIndex);..  if
15590 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
155a0 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
155b0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
155c0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
155d0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
155e0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
155f0 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
15600 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
15610 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
15620 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
15630 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
15640 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
15650 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
15660 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
15670 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
15680 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
15690 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
156a0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
156b0 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
156c0 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
156d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
156e0 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
156f0 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
15700 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
15710 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
15720 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
15730 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
15740 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
15750 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
15760 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
15770 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
15780 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
15790 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
157a0 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
157b0 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
157c0 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
157d0 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
157e0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
157f0 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
15800 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
15810 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
15820 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
15830 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
15840 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
15850 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
15860 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
15870 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
15880 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
15890 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
158a0 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
158b0 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
158c0 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
158d0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
158e0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
158f0 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
15900 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
15910 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
15920 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
15930 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
15940 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
15950 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
15960 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
15970 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
15980 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
15990 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
159a0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
159b0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
159c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
159d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
159e0 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61  _None );.      a
159f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74  ssert( pIdx->aut
15a00 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20  oIndex );.      
15a10 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
15a20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
15a30 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
15a40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49  Idx->nColumn!=pI
15a50 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
15a60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15a70 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
15a80 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a  >nColumn; k++){.
15a90 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15aa0 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
15ab0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
15ac0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
15ad0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
15ae0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
15af0 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
15b00 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
15b10 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
15b20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
15b30 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
15b40 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
15b50 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
15b60 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
15b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15b80 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
15b90 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
15ba0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
15bb0 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
15bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
15bd0 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
15be0 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
15bf0 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
15c00 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
15c10 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
15c20 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
15c30 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
15c40 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
15c50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
15c60 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
15c70 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
15c80 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
15c90 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
15ca0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
15cb0 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
15cc0 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
15cd0 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
15ce0 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
15cf0 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
15d00 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
15d10 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
15d20 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
15d30 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
15d40 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
15d50 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
15d60 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
15d70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15d80 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
15d90 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
15da0 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
15db0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
15dc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
15dd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15de0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
15df0 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
15e00 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
15e10 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
15e20 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
15e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
15e40 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
15e50 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
15e60 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
15e70 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
15e80 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
15e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ea0 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
15eb0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15ec0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
15ed0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
15ee0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
15ef0 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
15f00 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
15f10 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
15f20 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
15f30 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
15f40 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
15f50 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
15f60 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
15f70 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
15f80 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
15f90 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
15fc0 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
15fd0 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  n30(pIndex->zNam
15fe0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
16000 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
16010 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16020 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
16030 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
16040 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
16050 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
16060 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
16070 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16080 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
16090 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
160a0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
160b0 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
160c0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
160d0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
160e0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
160f0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
16100 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
16110 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
16120 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
16130 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
16140 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
16150 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
16160 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
16170 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
16180 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
16190 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
161a0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
161b0 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
161c0 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
161d0 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
161e0 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
161f0 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
16200 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
16210 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
16220 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
16230 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
16240 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
16250 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
16260 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
16270 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
16280 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
16290 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
162a0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
162b0 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
162c0 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
162d0 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
162e0 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
162f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
16300 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
16310 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
16320 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
16330 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
16340 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
16350 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
16360 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
16370 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
16380 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
16390 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
163a0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
163b0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
163c0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
163d0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
163e0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
163f0 6c 73 65 7b 20 2f 2a 20 69 66 28 20 64 62 2d 3e  lse{ /* if( db->
16400 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 2a  init.busy==0 ) *
16410 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  /.    Vdbe *v;. 
16420 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
16430 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
16440 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
16450 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
16460 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16470 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
16480 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
16490 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20  index;...    /* 
164a0 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
164b0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
164c0 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
164d0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
164e0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
164f0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
16500 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16510 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
16520 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20  , iDb, iMem);.. 
16530 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
16540 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
16550 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
16560 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
16570 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
16580 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
16590 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
165a0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
165b0 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
165c0 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
165d0 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
165e0 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
165f0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
16600 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
16610 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
16620 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
16630 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
16640 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
16650 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
16660 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d  ",.        pEnd-
16670 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20  >z - pName->z + 
16680 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  1,.        pName
16690 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
166a0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
166b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
166c0 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
166d0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
166e0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
166f0 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
16700 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
16710 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
16720 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
16730 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
16740 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
16750 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
16760 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
16770 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
16780 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
16790 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
167a0 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
167b0 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
167c0 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
167d0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
167e0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
167f0 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
16800 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
16810 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
16820 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
16830 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
16840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
16850 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
16860 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
16870 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
16880 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
16890 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
168a0 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
168b0 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
168c0 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
168d0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
168e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
168f0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
16900 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16910 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16920 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
16930 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
16940 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
16950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16960 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61  eAddOp4(v, OP_Pa
16970 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
16980 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  0, 0,.         s
16990 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
169a0 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70  , "name='%q'", p
169b0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50  Index->zName), P
169c0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
169d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
169e0 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op1(v, OP_Expire
169f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
16a00 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
16a10 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
16a20 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
16a30 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
16a40 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
16a50 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
16a60 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
16a70 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
16a80 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
16a90 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
16aa0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
16ab0 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
16ac0 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
16ad0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
16ae0 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
16af0 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
16b00 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
16b10 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
16b20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
16b30 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
16b40 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
16b50 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
16b60 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
16b70 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
16b80 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
16b90 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
16ba0 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
16bb0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
16bc0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
16bd0 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
16be0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
16bf0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
16c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16c10 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
16c20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
16c30 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
16c40 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
16c50 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
16c60 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
16c70 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
16c80 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
16c90 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
16ca0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
16cb0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
16cc0 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
16cd0 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
16ce0 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70    }.    pRet = p
16cf0 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65  Index;.    pInde
16d00 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
16d10 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
16d20 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
16d30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
16d40 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
16d50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16d60 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
16d70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
16d80 72 65 65 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  ree(db, pIndex);
16d90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
16da0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
16db0 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
16dc0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
16dd0 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
16de0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16df0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
16e00 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
16e10 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
16e20 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
16e30 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
16e40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
16e50 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
16e60 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
16e70 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
16e80 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
16e90 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
16ea0 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
16eb0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
16ec0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
16ed0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
16ee0 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
16ef0 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
16f00 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
16f10 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
16f20 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
16f30 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
16f40 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
16f50 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
16f60 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
16f70 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
16f80 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
16f90 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
16fa0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
16fb0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
16fc0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
16fd0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
16fe0 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
16ff0 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
17000 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
17010 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
17020 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
17030 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
17040 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
17050 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
17060 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
17070 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
17080 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
17090 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
170a0 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
170b0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
170c0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
170d0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
170e0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
170f0 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
17100 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
17110 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
17120 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
17130 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
17140 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
17150 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
17160 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
17170 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
17180 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
17190 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
171a0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
171b0 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
171c0 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
171d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
171e0 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  5; i--){.    a[i
171f0 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69  ] = 5;.  }.  whi
17200 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20  le( i>=1 ){.    
17210 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20  a[i] = 11 - i;. 
17220 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66     i--;.  }.  if
17230 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
17240 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
17250 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
17260 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
17270 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17280 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
17290 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
172a0 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
172b0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
172c0 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
172d0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
172e0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
172f0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
17300 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
17310 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
17320 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
17330 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
17340 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17350 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
17360 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
17370 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
17380 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
17390 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
173a0 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
173b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
173c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
173d0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
173e0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
173f0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
17400 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
17410 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
17420 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
17430 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
17440 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
17450 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
17460 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
17470 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
17480 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
17490 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
174a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
174b0 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
174c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
174d0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
174e0 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
174f0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
17500 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
17510 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
17520 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
17530 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
17540 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
17550 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
17560 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17570 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
17580 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
17590 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
175a0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
175b0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
175c0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
175d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
175e0 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
175f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
17600 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
17610 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
17620 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17630 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
17640 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
17650 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
17660 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
17670 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
17680 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
17690 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
176a0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
176b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
176c0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
176d0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
176e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
176f0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17700 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
17710 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
17720 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
17730 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
17740 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
17750 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
17760 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
17770 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
17780 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17790 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
177a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
177b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
177c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
177d0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
177e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
177f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17800 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
17810 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
17820 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
17830 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
17840 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
17850 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
17860 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
17870 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17880 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
17890 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
178a0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
178b0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
178c0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
178d0 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64  me=%Q",.       d
178e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
178f0 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
17900 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e  iDb),.       pIn
17910 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
17920 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
17930 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
17940 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64  sqlite_stat1", d
17950 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
17960 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
17970 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
17980 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
17990 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
179a0 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
179b0 45 20 69 64 78 3d 25 51 22 2c 0a 20 20 20 20 20  E idx=%Q",.     
179c0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
179d0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 7a  zName, pIndex->z
179e0 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
179f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
17a00 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
17a10 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65  se, iDb);.    de
17a20 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
17a30 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
17a40 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
17a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17a60 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
17a70 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64   iDb, 0, 0, pInd
17a80 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
17a90 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
17aa0 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
17ab0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
17ac0 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
17ad0 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69   pArray is a poi
17ae0 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79  nter to an array
17af0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 45 61   of objects.  Ea
17b00 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
17b10 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
17b20 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
17b30 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ze.  This routin
17b40 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  e allocates a ne
17b50 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74  w.** object on t
17b60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 72  he end of the ar
17b70 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e  ray..**.** *pnEn
17b80 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  try is the numbe
17b90 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 72  r of entries alr
17ba0 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20 2a 70  eady in use.  *p
17bb0 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65  nAlloc is.** the
17bc0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
17bd0 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68  cated size of th
17be0 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74 53 69  e array.  initSi
17bf0 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 75 67  ze is the.** sug
17c00 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61  gested initial a
17c10 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61  rray size alloca
17c20 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
17c30 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
17c40 20 65 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e   entry is return
17c50 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a  ed in *pIdx..**.
17c60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17c70 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
17c80 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
17c90 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73  f objects.  This
17ca0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 68 65  .** might be the
17cb0 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 41 72   same as the pAr
17cc0 72 61 79 20 70 61 72 61 6d 65 74 65 72 20 6f 72  ray parameter or
17cd0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 64   it might be a d
17ce0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e  ifferent.** poin
17cf0 74 65 72 20 69 66 20 74 68 65 20 61 72 72 61 79  ter if the array
17d00 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f   was resized..*/
17d10 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72  .void *sqlite3Ar
17d20 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  rayAllocate(.  s
17d30 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
17d40 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
17d50 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
17d60 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
17d70 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20   void *pArray,  
17d80 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
17d90 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62  bjects.  Might b
17da0 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  e reallocated */
17db0 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20  .  int szEntry, 
17dc0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
17dd0 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  each object in t
17de0 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  he array */.  in
17df0 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20 20 20  t initSize,     
17e00 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69 6e 69  /* Suggested ini
17e10 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  tial allocation,
17e20 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   in elements */.
17e30 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
17e40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17e50 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
17e60 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
17e70 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20 20  nt *pnAlloc,    
17e80 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
17e90 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
17ea0 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  on, in elements 
17eb0 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20  */.  int *pIdx  
17ec0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
17ed0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e  the index of a n
17ee0 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a  ew slot here */.
17ef0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
17f00 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e 3d 20  if( *pnEntry >= 
17f10 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  *pnAlloc ){.    
17f20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20  void *pNew;.    
17f30 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  int newSize;.   
17f40 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70 6e 41   newSize = (*pnA
17f50 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74 53 69  lloc)*2 + initSi
17f60 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  ze;.    pNew = s
17f70 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
17f80 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65 77 53  db, pArray, newS
17f90 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20  ize*szEntry);.  
17fa0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17fb0 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
17fc0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
17fd0 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
17fe0 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c    *pnAlloc = sql
17ff0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
18000 28 64 62 2c 20 70 4e 65 77 29 2f 73 7a 45 6e 74  (db, pNew)/szEnt
18010 72 79 3b 0a 20 20 20 20 70 41 72 72 61 79 20 3d  ry;.    pArray =
18020 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
18030 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
18040 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e 45    memset(&z[*pnE
18050 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  ntry * szEntry],
18060 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
18070 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79  *pIdx = *pnEntry
18080 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
18090 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
180a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
180b0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
180c0 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
180d0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
180e0 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
180f0 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
18100 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
18110 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
18120 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
18130 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
18140 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
18150 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
18160 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
18170 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
18180 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
18190 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
181a0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
181b0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
181c0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
181d0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
181e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
181f0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
18200 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
18210 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
18220 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
18230 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
18240 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
18250 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
18260 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70       5,.      &p
18270 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
18280 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c   &pList->nAlloc,
18290 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
182a0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
182b0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
182c0 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
182d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
182e0 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
182f0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
18300 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
18310 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
18320 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
18330 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
18340 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
18350 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
18360 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
18370 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
18380 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
18390 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
183a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
183b0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
183c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
183d0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
183e0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
183f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18400 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
18410 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18420 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
18430 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
18440 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
18450 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
18460 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
18470 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
18480 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
18490 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
184a0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
184b0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
184c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
184d0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
184e0 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
184f0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
18500 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
18510 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
18520 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
18530 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
18540 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
18550 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n -1;.}../*.** E
18560 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
18570 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
18580 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
18590 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
185a0 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
185b0 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
185c0 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
185d0 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
185e0 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
185f0 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
18600 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
18610 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
18620 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
18630 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
18640 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
18650 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
18660 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
18670 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
18680 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
18690 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
186a0 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
186b0 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
186c0 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
186d0 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
186e0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
186f0 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
18700 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
18710 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
18720 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
18730 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
18740 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
18750 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
18760 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
18770 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
18780 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
18790 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
187a0 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
187b0 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
187c0 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
187d0 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
187e0 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65  cation fails the
187f0 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68   SrcList is unch
18800 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64  anged.  The.** d
18810 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18820 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74  flag will be set
18830 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63   to true..*/.Src
18840 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
18850 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73  ListEnlarge(.  s
18860 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18870 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
18880 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
18890 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73  fy of OOM errors
188a0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
188b0 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
188c0 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e  SrcList to be en
188d0 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  larged */.  int 
188e0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f  nExtra,        /
188f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20  * Number of new 
18900 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20  slots to add to 
18910 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69  pSrc->a[] */.  i
18920 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20  nt iStart       
18930 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53    /* Index in pS
18940 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74  rc->a[] of first
18950 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a   new slot */.){.
18960 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
18970 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
18980 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65  n calling parame
18990 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ters */.  assert
189a0 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20  ( iStart>=0 );. 
189b0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
189c0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
189d0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pSrc!=0 );.  ass
189e0 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72  ert( iStart<=pSr
189f0 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a  c->nSrc );..  /*
18a00 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69   Allocate additi
18a10 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65  onal space if ne
18a20 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53  eded */.  if( pS
18a30 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e  rc->nSrc+nExtra>
18a40 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pSrc->nAlloc ){.
18a50 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
18a60 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  w;.    int nAllo
18a70 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  c = pSrc->nSrc+n
18a80 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e  Extra;.    int n
18a90 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  Got;.    pNew = 
18aa0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
18ab0 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  (db, pSrc,.     
18ac0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
18ad0 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f  (*pSrc) + (nAllo
18ae0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63  c-1)*sizeof(pSrc
18af0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
18b00 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
18b10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
18b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
18b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72        return pSr
18b40 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  c;.    }.    pSr
18b50 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47  c = pNew;.    nG
18b60 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d  ot = (sqlite3DbM
18b70 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e  allocSize(db, pN
18b80 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53  ew) - sizeof(*pS
18b90 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63  rc))/sizeof(pSrc
18ba0 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70  ->a[0])+1;.    p
18bb0 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75  Src->nAlloc = (u
18bc0 31 36 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20  16)nGot;.  }..  
18bd0 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
18be0 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
18bf0 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
18c00 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
18c10 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
18c20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
18c30 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
18c40 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
18c50 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
18c60 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
18c70 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
18c80 72 63 20 2b 3d 20 28 69 31 36 29 6e 45 78 74 72  rc += (i16)nExtr
18c90 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  a;..  /* Zero th
18ca0 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  e newly allocate
18cb0 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d  d slots */.  mem
18cc0 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74  set(&pSrc->a[iSt
18cd0 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  art], 0, sizeof(
18ce0 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74  pSrc->a[0])*nExt
18cf0 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74  ra);.  for(i=iSt
18d00 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45  art; i<iStart+nE
18d10 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xtra; i++){.    
18d20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
18d30 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  or = -1;.  }..  
18d40 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
18d50 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72  ter to the enlar
18d60 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  ged SrcList */. 
18d70 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a   return pSrc;.}.
18d80 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
18d90 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
18da0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
18db0 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
18dc0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
18dd0 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
18de0 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
18df0 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
18e00 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65  t even if pTable
18e10 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
18e20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  A SrcList is ret
18e30 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
18e40 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f  f there is an OO
18e50 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65  M error.  The re
18e60 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73  turned.** SrcLis
18e70 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73  t might be the s
18e80 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69  ame as the SrcLi
18e90 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75  st that was inpu
18ea0 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  t or it might be
18eb0 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20  .** a new one.  
18ec0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
18ed0 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65  does occurs, the
18ee0 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75  n the prior valu
18ef0 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68  e of pList.** th
18f00 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74  at is input to t
18f10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18f20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65  utomatically fre
18f30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ed..**.** If pDa
18f40 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
18f50 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
18f60 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
18f70 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
18f80 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
18f90 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
18fa0 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
18fb0 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
18fc0 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
18fd0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
18fe0 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
18ff0 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
19000 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
19010 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
19020 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
19030 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
19040 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
19050 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
19060 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
19070 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
19080 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
19090 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
190a0 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
190b0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
190c0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
190d0 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
190e0 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
190f0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
19100 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
19110 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
19120 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
19130 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
19140 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
19150 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a  end(D,A,B,0);.**
19160 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
19170 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
19180 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
19190 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
191a0 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
191b0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
191c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
191d0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
191e0 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
191f0 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
19200 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
19210 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
19220 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e  .  If C is defin
19230 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73  ed.** then so is
19240 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f   B.  In other wo
19250 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61  rds, we never ha
19260 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a  ve a case where:
19270 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
19280 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
19290 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a  end(D,A,0,C);.**
192a0 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20  .** Both pTable 
192b0 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72  and pDatabase ar
192c0 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  e assumed to be 
192d0 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72  quoted.  They ar
192e0 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65  e dequoted.** be
192f0 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64  fore being added
19300 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e   to the SrcList.
19310 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
19320 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
19330 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
19340 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ,        /* Conn
19350 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
19360 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
19370 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  res */.  SrcList
19380 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
19390 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53  Append to this S
193a0 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65  rcList. NULL cre
193b0 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69  ates a new SrcLi
193c0 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
193d0 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
193e0 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a  able to append *
193f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
19400 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62  base    /* Datab
19410 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ase of the table
19420 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
19430 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
19440 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tem;.  assert( p
19450 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70  Database==0 || p
19460 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20  Table!=0 );  /* 
19470 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69  Cannot have C wi
19480 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28  thout B */.  if(
19490 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
194a0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
194b0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
194c0 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
194d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
194e0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
194f0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
19500 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c  oc = 1;.  }.  pL
19510 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63  ist = sqlite3Src
19520 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
19530 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d  pList, 1, pList-
19540 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62  >nSrc);.  if( db
19550 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19560 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  {.    sqlite3Src
19570 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
19580 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
19590 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  n 0;.  }.  pItem
195a0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
195b0 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  st->nSrc-1];.  i
195c0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
195d0 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
195e0 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
195f0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
19600 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
19610 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
19620 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
19630 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
19640 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
19650 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
19660 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
19670 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
19680 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
19690 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
196a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
196b0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74  omToken(db, pDat
196c0 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  abase);.  return
196d0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
196e0 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
196f0 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
19700 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
19710 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
19720 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
19730 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
19740 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
19750 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
19760 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
19770 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19780 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
19790 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
197a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
197b0 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
197c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
197d0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
197e0 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
197f0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
19800 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
19810 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
19820 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
19830 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
19840 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
19850 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
19860 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
19870 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
19880 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
19890 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
198a0 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
198b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
198c0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
198d0 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
198e0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
198f0 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
19900 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
19910 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
19920 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
19930 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
19940 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
19950 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
19960 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
19970 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
19980 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
19990 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
199a0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
199b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
199c0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
199d0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
199e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
199f0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
19a00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19a10 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
19a20 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ias);.    sqlite
19a30 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
19a40 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
19a50 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
19a60 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  le(pItem->pTab);
19a70 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
19a80 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
19a90 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
19aa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
19ab0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
19ac0 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
19ad0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
19ae0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
19af0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
19b00 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
19b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19b20 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19b30 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
19b40 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
19b50 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
19b60 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
19b70 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
19b80 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
19b90 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
19ba0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
19bb0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
19bc0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
19bd0 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
19be0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
19bf0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
19c00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
19c10 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
19c20 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
19c30 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
19c40 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
19c50 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
19c60 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
19c70 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
19c80 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
19c90 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
19ca0 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
19cb0 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
19cc0 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
19cd0 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e  as a alias, then
19ce0 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
19cf0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
19d00 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
19d10 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
19d20 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
19d30 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
19d40 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
19d50 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
19d60 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
19d70 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
19d80 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
19d90 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
19da0 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
19db0 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
19dc0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
19dd0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
19de0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
19df0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
19e00 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
19e10 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
19e20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
19e30 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
19e40 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
19e50 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
19e60 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
19e70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19e80 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
19e90 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
19ea0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19ec0 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
19ed0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19ee0 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
19ef0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
19f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
19f10 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
19f20 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
19f30 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
19f40 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
19f50 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
19f70 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
19f80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
19f90 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
19fa0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
19fb0 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
19fc0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
19fd0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
19fe0 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
19ff0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
1a000 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
1a010 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
1a020 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
1a030 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
1a040 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
1a050 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
1a060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a070 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1a080 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
1a090 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a0a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
1a0b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1a0c0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
1a0d0 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
1a0e0 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
1a0f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a100 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
1a110 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
1a120 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
1a130 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
1a140 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
1a150 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1a160 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1a170 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
1a180 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
1a190 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
1a1a0 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1a1b0 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63  || NEVER(p->nSrc
1a1c0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==0) ){.    goto
1a1d0 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1a1e0 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  or;.  }.  pItem 
1a1f0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1a200 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41  1];.  assert( pA
1a210 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
1a220 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
1a230 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
1a240 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1a250 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
1a260 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
1a270 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
1a280 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
1a290 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
1a2a0 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
1a2b0 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
1a2c0 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
1a2d0 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
1a2e0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1a2f0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a300 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
1a310 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1a320 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
1a330 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1a340 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
1a350 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1a360 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
1a370 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
1a380 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
1a390 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1a3a0 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
1a3b0 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
1a3c0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
1a3d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1a3e0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1a3f0 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
1a400 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
1a410 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
1a420 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
1a430 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
1a440 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
1a450 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
1a460 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20  p->nSrc>0) ){.  
1a470 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1a480 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1a490 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1a4a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1a4b0 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  em->notIndexed==
1a4c0 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  0 && pItem->zInd
1a4d0 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ex==0 );.    if(
1a4e0 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
1a4f0 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
1a500 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
1a510 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
1a520 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
1a530 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
1a540 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
1a550 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
1a560 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
1a570 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
1a580 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
1a590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a5a0 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d   pItem->zIndex =
1a5b0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1a5c0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1a5d0 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  , pIndexedBy);. 
1a5e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1a5f0 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
1a600 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
1a610 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
1a620 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1a630 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
1a640 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
1a650 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
1a660 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
1a670 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
1a680 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
1a690 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
1a6a0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
1a6b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1a6c0 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
1a6d0 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
1a6e0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
1a6f0 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
1a700 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
1a710 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
1a720 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
1a730 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1a740 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
1a750 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
1a760 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
1a770 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
1a780 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
1a790 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
1a7a0 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
1a7b0 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
1a7c0 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
1a7d0 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
1a7e0 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
1a7f0 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
1a800 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
1a810 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
1a820 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
1a830 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
1a840 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1a850 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
1a860 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
1a870 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20  ( p && p->a ){. 
1a880 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1a890 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
1a8a0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1a8b0 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[i].jointype
1a8c0 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69   = p->a[i-1].joi
1a8d0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
1a8e0 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70   p->a[0].jointyp
1a8f0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
1a900 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
1a910 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1a920 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
1a930 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1a940 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
1a950 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a960 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
1a970 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
1a980 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64  pParse!=0 );.  d
1a990 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1a9a0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1a9b0 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61  );./*  if( db->a
1a9c0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
1a9d0 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20  eturn; */.  if( 
1a9e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1a9f0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1aa00 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
1aa10 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
1aa20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1aa30 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1aa40 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1aa50 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
1aa60 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
1aa70 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
1aa80 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1aa90 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
1aaa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1aab0 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
1aac0 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
1aad0 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
1aae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1aaf0 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
1ab00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1ab10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ab20 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1ab30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
1ab40 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
1ab50 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
1ab60 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
1ab70 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1ab80 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1ab90 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1aba0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1abb0 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1abc0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1abd0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1abe0 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1abf0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1ac00 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1ac10 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ac20 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ac30 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
1ac40 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  T", 0, 0) ){.   
1ac50 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1ac60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1ac70 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1ac80 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1ac90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aca0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1acb0 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1acc0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
1acd0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1ace0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
1acf0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1ad00 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1ad10 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1ad20 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
1ad30 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1ad40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ad50 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1ad60 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1ad70 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1ad80 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1ad90 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ada0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1adb0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
1adc0 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
1add0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1ade0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1adf0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1ae00 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1ae10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae20 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1ae30 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1ae40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ae50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ae60 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1ae70 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1ae80 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1ae90 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1aea0 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1aeb0 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1aec0 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1aed0 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1aee0 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1aef0 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1af00 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1af10 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1af20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1af30 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1af40 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1af50 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1af60 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1af70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1af80 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1af90 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1afa0 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49   *az[] = { "BEGI
1afb0 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
1afc0 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
1afd0 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
1afe0 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
1aff0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
1b000 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
1b010 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
1b020 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
1b030 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
1b040 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1b050 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
1b060 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
1b070 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b080 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1b090 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
1b0a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1b0b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b0c0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
1b0d0 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
1b0e0 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
1b0f0 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1b100 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
1b110 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
1b120 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
1b130 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
1b140 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1b150 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
1b160 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
1b170 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
1b180 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
1b190 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
1b1a0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
1b1b0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1b1c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b1d0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1b1e0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
1b1f0 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
1b200 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
1b210 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63  t rc;.    static
1b220 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
1b230 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
1b240 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1b250 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
1b260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1b270 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
1b280 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1b290 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
1b2a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1b2b0 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1b2c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b2d0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
1b2e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1b2f0 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
1b300 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   0, SQLITE_DEFAU
1b310 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66  LT_CACHE_SIZE, f
1b320 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b         &db->aDb[
1b350 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
1b360 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b370 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b380 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b390 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1b3a0 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
1b3b0 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
1b3c0 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
1b3d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b3e0 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
1b3f0 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
1b400 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1b410 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 64  }.    assert( (d
1b420 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1b430 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c  E_InTrans)==0 ||
1b440 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
1b450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
1b460 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1b470 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
1b480 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
1b490 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1b4a0 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  er(db->aDb[1].pB
1b4b0 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d  db->dfltJournalM
1b4e0 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ode);.  }.  retu
1b4f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
1b500 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1b510 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
1b520 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1b530 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
1b540 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
1b550 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
1b560 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1b570 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
1b580 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1b590 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
1b5a0 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
1b5b0 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
1b5c0 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
1b5d0 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
1b5e0 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
1b5f0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
1b600 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
1b610 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1b620 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
1b630 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
1b640 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
1b650 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
1b660 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
1b670 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1b680 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1b690 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
1b6a0 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
1b6b0 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
1b6c0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
1b6d0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1b6e0 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
1b6f0 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
1b700 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
1b710 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
1b720 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
1b730 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
1b740 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
1b750 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
1b760 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
1b770 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
1b780 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
1b790 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
1b7a0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
1b7b0 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
1b7c0 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
1b7d0 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
1b7e0 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
1b7f0 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
1b800 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1b810 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
1b820 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
1b830 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
1b840 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
1b850 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
1b860 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
1b870 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
1b880 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
1b890 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
1b8a0 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
1b8b0 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
1b8c0 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
1b8d0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
1b8e0 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
1b8f0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1b900 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
1b910 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
1b920 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
1b930 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
1b940 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
1b950 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
1b960 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1b970 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1b980 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1b990 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
1b9a0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1b9b0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1b9c0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
1b9d0 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d    if( pToplevel-
1b9e0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
1b9f0 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
1ba00 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1ba10 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 69  Toplevel);.    i
1ba20 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1ba30 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
1ba40 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
1ba50 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
1ba60 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c 65  or */.    pTople
1ba70 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  vel->cookieGoto 
1ba80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ba90 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1baa0 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
1bab0 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
1bac0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bad0 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20 20  Toplevel->db;.  
1bae0 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 20    int mask;..   
1baf0 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
1bb00 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
1bb10 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1bb20 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
1bb30 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1bb40 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
1bb50 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
1bb60 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
1bb70 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70 6c 65  .    if( (pTople
1bb80 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  vel->cookieMask 
1bb90 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1bba0 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63      pToplevel->c
1bbb0 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  ookieMask |= mas
1bbc0 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  k;.      pToplev
1bbd0 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  el->cookieValue[
1bbe0 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  iDb] = db->aDb[i
1bbf0 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
1bc00 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
1bc10 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1bc20 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
1bc30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
1bc40 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
1bc50 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
1bc60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1bc70 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1bc80 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
1bc90 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
1bca0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
1bcb0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1bcc0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
1bcd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bce0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
1bcf0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
1bd00 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
1bd10 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
1bd20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1bd30 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
1bd40 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1bd50 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
1bd60 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
1bd70 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
1bd80 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
1bd90 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
1bda0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
1bdb0 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
1bdc0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
1bdd0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
1bde0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
1bdf0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
1be00 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
1be10 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
1be20 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
1be30 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1be40 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
1be50 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
1be60 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
1be70 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
1be80 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
1be90 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
1bea0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
1beb0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
1bec0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
1bed0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
1bee0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
1bef0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
1bf00 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
1bf10 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
1bf20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1bf30 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1bf40 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1bf50 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1bf60 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
1bf70 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1bf80 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1bf90 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
1bfa0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1bfb0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1bfc0 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77  ;.  pToplevel->w
1bfd0 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  riteMask |= 1<<i
1bfe0 44 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  Db;.  pToplevel-
1bff0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d  >isMultiWrite |=
1c000 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d   setStatement;.}
1c010 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
1c020 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
1c030 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ent currently un
1c040 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1c050 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20   might write.** 
1c060 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e  more than one en
1c070 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65  try (example: de
1c080 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74  leting one row t
1c090 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e  hen inserting an
1c0a0 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74  other,.** insert
1c0b0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ing multiple row
1c0c0 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72  s in a table, or
1c0d0 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77   inserting a row
1c0e0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
1c0f0 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62  es.).** If an ab
1c100 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  ort occurs after
1c110 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77   some of these w
1c120 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c  rites have compl
1c130 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69  eted, then it wi
1c140 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  ll.** be necessa
1c150 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63  ry to undo the c
1c160 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e  ompleted writes.
1c170 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c180 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65  MultiWrite(Parse
1c190 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
1c1a0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1c1b0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1c1c0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1c1d0 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
1c1e0 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a  tiWrite = 1;.}..
1c1f0 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  /* .** The code 
1c200 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20  generator calls 
1c210 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20  this routine if 
1c220 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  is discovers tha
1c230 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69  t it is.** possi
1c240 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73  ble to abort a s
1c250 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74  tatement prior t
1c260 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  o completion.  I
1c270 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70  n order to .** p
1c280 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72  erform this abor
1c290 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70  t without corrup
1c2a0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1c2b0 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  e, we need to ma
1c2c0 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20  ke.** sure that 
1c2d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
1c2e0 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
1c2f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1c300 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63  ction..**.** Tec
1c310 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c  hnically, we onl
1c320 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68  y need to set th
1c330 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20  e mayAbort flag 
1c340 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74  if the.** isMult
1c350 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20  iWrite flag was 
1c360 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20  previously set. 
1c370 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65   There is a time
1c380 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73   dependency.** s
1c390 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f  uch that the abo
1c3a0 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66  rt must occur af
1c3b0 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69  ter the multiwri
1c3c0 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a  te.  This makes.
1c3d0 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  ** some statemen
1c3e0 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65  ts involving the
1c3f0 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63   REPLACE conflic
1c400 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
1c410 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c  orithm.** go a l
1c420 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42  ittle faster.  B
1c430 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74  ut taking advant
1c440 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65  age of this time
1c450 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d   dependency.** m
1c460 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66  akes it more dif
1c470 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20  ficult to prove 
1c480 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73  that the code is
1c490 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a   correct (in .**
1c4a0 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20   particular, it 
1c4b0 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
1c4c0 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65   writing an effe
1c4d0 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ctive.** impleme
1c4e0 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
1c4f0 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
1c500 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61  ()) and so we ha
1c510 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20  ve chosen.** to 
1c520 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f  take the safe ro
1c530 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65  ute and skip the
1c540 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1c550 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
1c560 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50  yAbort(Parse *pP
1c570 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
1c580 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1c590 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1c5a0 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
1c5b0 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20  level->mayAbort 
1c5c0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 1;.}../*.** Co
1c5d0 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68  de an OP_Halt th
1c5e0 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64  at causes the vd
1c5f0 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  be to return an 
1c600 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1c610 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20  T.** error. The 
1c620 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  onError paramete
1c630 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  r determines whi
1c640 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74  ch (if any) of t
1c650 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
1c660 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74  and/or current t
1c670 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1c680 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f  lled back..*/.vo
1c690 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  id sqlite3HaltCo
1c6a0 6e 73 74 72 61 69 6e 74 28 50 61 72 73 65 20 2a  nstraint(Parse *
1c6b0 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
1c6c0 72 6f 72 2c 20 63 68 61 72 20 2a 70 34 2c 20 69  ror, char *p4, i
1c6d0 6e 74 20 70 34 74 79 70 65 29 7b 0a 20 20 56 64  nt p4type){.  Vd
1c6e0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
1c6f0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1c700 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
1c710 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
1c720 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
1c730 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
1c740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1c750 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
1c760 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f  TE_CONSTRAINT, o
1c770 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
1c780 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  4type);.}../*.**
1c790 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1c7a0 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
1c7b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1c7c0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
1c7d0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
1c7e0 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
1c7f0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1c800 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1c810 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
1c820 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
1c830 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
1c840 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
1c850 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
1c860 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
1c870 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
1c880 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
1c890 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1c8a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c8b0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1c8c0 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
1c8d0 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( z!=0 );.    if
1c8e0 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
1c8f0 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
1c900 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1c910 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c920 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1c930 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
1c940 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1c950 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
1c960 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1c970 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
1c980 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
1c990 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
1c9a0 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
1c9b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1c9c0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1c9d0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
1c9e0 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
1c9f0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
1ca00 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
1ca10 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Coll){.  Index *
1ca20 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
1ca30 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
1ca40 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ca50 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28   pTab */..  for(
1ca60 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
1ca70 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
1ca80 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
1ca90 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c  t){.    if( zCol
1caa0 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
1cab0 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
1cac0 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69  ndex) ){.      i
1cad0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
1cae0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
1caf0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
1cb00 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
1cb10 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1cb20 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1cb30 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
1cb40 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1cb50 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1cb60 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  dex, -1);.    }.
1cb70 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1cb80 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1cb90 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c  l indices of all
1cba0 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64   tables in all d
1cbb0 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74  atabases where t
1cbc0 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73  he.** indices us
1cbd0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1cbe0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1cbf0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
1cc00 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61  n recompute.** a
1cc10 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79  ll indices every
1cc20 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  where..*/.#ifnde
1cc30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1cc40 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
1cc50 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73  d reindexDatabas
1cc60 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
1cc70 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
1cc80 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1ccb0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
1ccc0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
1ccd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cce0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
1ccf0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
1cd00 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cd10 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
1cd20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1cd30 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
1cd40 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
1cd50 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1cd60 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
1cd70 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
1cd80 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
1cd90 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
1cda0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1cdb0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d  e */..  for(iDb=
1cdc0 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
1cdd0 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
1cde0 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
1cdf0 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
1ce00 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
1ce10 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
1ce20 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
1ce30 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
1ce40 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
1ce50 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
1ce60 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
1ce70 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
1ce80 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
1ce90 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
1cea0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
1ceb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
1cec0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1ced0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
1cee0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
1cef0 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
1cf20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
1cf30 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
1cf40 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
1cf50 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
1cf60 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
1cf70 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
1cf80 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
1cf90 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
1cfa0 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
1cfb0 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
1cfc0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1cfd0 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
1cfe0 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
1cff0 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
1d000 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
1d010 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
1d020 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
1d030 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
1d040 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
1d050 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
1d060 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
1d070 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
1d080 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
1d090 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
1d0a0 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
1d0b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d0c0 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
1d0d0 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
1d0e0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1d0f0 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
1d100 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
1d110 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
1d120 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
1d130 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
1d140 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
1d150 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
1d160 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
1d170 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1d180 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
1d190 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
1d1a0 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
1d1b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1d1c0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1d1d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d1f0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
1d200 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
1d210 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
1d220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
1d230 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1d240 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
1d250 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1d260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d270 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
1d280 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
1d290 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1d2a0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
1d2b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1d2c0 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
1d2d0 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
1d2e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1d2f0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1d300 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
1d310 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
1d320 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1d330 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
1d340 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
1d350 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1d360 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
1d370 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
1d380 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
1d390 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
1d3a0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
1d3b0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
1d3c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
1d3d0 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
1d3e0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
1d3f0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
1d400 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1d410 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
1d420 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
1d430 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
1d440 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
1d450 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
1d460 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
1d470 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1d480 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1d490 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
1d4a0 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
1d4b0 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
1d4c0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
1d4d0 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
1d4e0 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
1d4f0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1d500 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
1d510 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
1d520 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1d530 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
1d540 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
1d550 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
1d560 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1d570 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
1d580 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
1d590 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
1d5a0 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
1d5b0 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
1d5c0 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
1d5d0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
1d5e0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1d5f0 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
1d600 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
1d610 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
1d620 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  Db].zName;.  pTa
1d630 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
1d640 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29  able(db, z, zDb)
1d650 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
1d660 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
1d670 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
1d680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1d690 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
1d6a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
1d6b0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1d6c0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
1d6d0 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  zDb);.  sqlite3D
1d6e0 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
1d6f0 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
1d700 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1d710 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1d720 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
1d730 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1d740 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1d750 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
1d760 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
1d770 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d780 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
1d790 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
1d7a0 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
1d7b0 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ed");.}.#endif..
1d7c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64  /*.** Return a d
1d7d0 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74  ynamicly allocat
1d7e0 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ed KeyInfo struc
1d7f0 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65  ture that can be
1d800 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50   used.** with OP
1d810 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f  _OpenRead or OP_
1d820 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63  OpenWrite to acc
1d830 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64  ess database ind
1d840 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex pIdx..**.** I
1d850 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  f successful, a 
1d860 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
1d870 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ew structure is 
1d880 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
1d890 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61  s case.** the ca
1d8a0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1d8b0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20  ble for calling 
1d8c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d8d0 2c 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  , ) on the retur
1d8e0 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  ned .** pointer.
1d8f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d900 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f  urs (out of memo
1d910 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f  ry or missing co
1d920 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75  llation .** sequ
1d930 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72  ence), NULL is r
1d940 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
1d950 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20  state of pParse 
1d960 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
1d970 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  ct.** the error.
1d980 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
1d990 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
1d9a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d9b0 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1d9c0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
1d9d0 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
1d9e0 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20  n;.  int nBytes 
1d9f0 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  = sizeof(KeyInfo
1da00 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
1da10 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
1da20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  nCol;.  sqlite3 
1da30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1da40 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1da50 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73  y = (KeyInfo *)s
1da60 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1da70 72 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a  ro(db, nBytes);.
1da80 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1da90 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50     pKey->db = pP
1daa0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b  arse->db;.    pK
1dab0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ey->aSortOrder =
1dac0 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61   (u8 *)&(pKey->a
1dad0 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20  Coll[nCol]);.   
1dae0 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e   assert( &pKey->
1daf0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d  aSortOrder[nCol]
1db00 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29  ==&(((u8 *)pKey)
1db10 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20  [nBytes]) );.   
1db20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1db30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
1db40 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
1db50 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1db60 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c     assert( zColl
1db70 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e   );.      pKey->
1db80 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
1db90 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
1dba0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
1dbb0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
1dbc0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
1dbd0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
1dbe0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d  .    }.    pKey-
1dbf0 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
1dc00 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Col;.  }..  if( 
1dc10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1dc20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1dc30 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20  e(db, pKey);.   
1dc40 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20   pKey = 0;.  }. 
1dc50 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.