/ Hex Artifact Content
Login

Artifact a5688630ba792987dca4daa62aae5ea30d1fad67:


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 33 31 34 20 32 30 30 35 2f 30 33 2f 31 37  1.314 2005/03/17
02f0: 20 30 35 3a 30 33 3a 33 39 20 64 61 6e 69 65 6c   05:03:39 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 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0430: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0440: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0450: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0460: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0470: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0480: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0490: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
04a0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04b0: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
04c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
04d0: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
04e0: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
04f0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0500: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0510: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0520: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0530: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0540: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0550: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0560: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0570: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0580: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0590: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
05a0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
05b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
05c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
05d0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
05e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
05f0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0600: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0610: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  sted ) return;. 
0620: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 56   if( !pParse->pV
0630: 64 62 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  dbe ){.    if( p
0640: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0650: 45 5f 4f 4b 20 26 26 20 70 50 61 72 73 65 2d 3e  E_OK && pParse->
0660: 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70 50  nErr ){.      pP
0670: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
0680: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
0690: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
06a0: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
06b0: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
06c0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
06d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
06e0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
06f0: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
0700: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
0710: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0720: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
0730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
0740: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
0750: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
0760: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
0770: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0780: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0790: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
07a0: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
07b0: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
07c0: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
07d0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
07e0: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
07f0: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
0800: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
0810: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
0820: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
0830: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0840: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
0850: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
0860: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
0870: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0880: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0890: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
08a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
08b0: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
08c0: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
08d0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
08e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
08f0: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
0900: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
0910: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
0920: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
0930: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
0940: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
0950: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
0960: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
0970: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0980: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0990: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
09a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
09b0: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
09c0: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
09d0: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
09e0: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
09f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a00: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
0a10: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
0a20: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
0a30: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
0a40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
0a60: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
0a70: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a80: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a90: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0aa0: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0ab0: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0ac0: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0ad0: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0ae0: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0af0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0b00: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0b10: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0b20: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0b30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0b40: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0b50: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0b60: 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ce()..    */.   
0b70: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0b80: 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  v, OP_Noop, 0, 0
0b90: 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20  , pParse->zSql, 
0ba0: 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50  pParse->zTail-pP
0bb0: 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d  arse->zSql);.  }
0bc0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
0bd0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
0be0: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
0bf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
0c00: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
0c10: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
0c20: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
0c30: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
0c40: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
0c50: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
0c60: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
0c70: 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
0c80: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
0c90: 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  , pParse->nVar, 
0ca0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a  pParse->nMem+3,.
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
0cd0: 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d  >nTab+3, pParse-
0ce0: 3e 6e 4d 61 78 44 65 70 74 68 2b 31 2c 20 70 50  >nMaxDepth+1, pP
0cf0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
0d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0d10: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
0d20: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
0d30: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
0d40: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
0d50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
0d60: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0d70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
0d80: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
0d90: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
0da0: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
0db0: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
0dc0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
0dd0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
0de0: 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  kieMask = 0;.  p
0df0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
0e00: 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  o = 0;.}../*.** 
0e10: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
0e20: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
0e30: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
0e40: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
0e50: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
0e60: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
0e70: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
0e80: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
0e90: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
0ea0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
0eb0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
0ec0: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
0ed0: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
0ee0: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
0ef0: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
0f00: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
0f10: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
0f20: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
0f30: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
0f40: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
0f50: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
0f60: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
0f70: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
0f80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
0f90: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
0fa0: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
0fb0: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
0fc0: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
0fd0: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
0fe0: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
0ff0: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
1000: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
1010: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
1020: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
1030: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
1040: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1050: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
1060: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
1070: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
1080: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1090: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
10a0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
10b0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
10c0: 20 72 63 3b 0a 23 20 64 65 66 69 6e 65 20 53 41   rc;.# define SA
10d0: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
10e0: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
10f0: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1100: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1110: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1120: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1130: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1140: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1150: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1160: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1170: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1180: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1190: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
11a0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
11b0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
11c0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
11d0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
11e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
11f0: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1200: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1210: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1220: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1230: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1240: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1250: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1260: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1270: 56 45 5f 53 5a 29 3b 0a 20 20 72 63 20 3d 20 73  VE_SZ);.  rc = s
1280: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
1290: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29  pParse, zSql, 0)
12a0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
12b0: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
12c0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
12d0: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
12e0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
12f0: 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  d--;.}../*.** Lo
1300: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1310: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1320: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1330: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1340: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1350: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1360: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1370: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1380: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1390: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
13a0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
13b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
13c0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
13d0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
13e0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
13f0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1400: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
1410: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
1420: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
1430: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1440: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
1450: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
1460: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1470: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
1480: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
1490: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
14a0: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
14b0: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
14c0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
14d0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
14e0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
14f0: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
1500: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
1510: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
1520: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1530: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1540: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
1550: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
1560: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1570: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61   zName!=0 );.  a
1580: 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1590: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69  s & SQLITE_Initi
15a0: 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69  alized) || db->i
15b0: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f  nit.busy );.  fo
15c0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
15d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
15e0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
15f0: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
1600: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
1610: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
1620: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
1630: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
1640: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
1650: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
1660: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
1670: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
1680: 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68  ->aDb[j].tblHash
1690: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
16a0: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69  zName)+1);.    i
16b0: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
16c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
16d0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
16e0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
16f0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1700: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
1710: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
1720: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
1730: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
1740: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1750: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
1760: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
1770: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1780: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
1790: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20   if not found.  
17a0: 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a  Also leave an.**
17b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
17c0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
17d0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  g..**.** The dif
17e0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
17f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
1800: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1810: 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
1820: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76  .** routine leav
1830: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
1840: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
1850: 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20  ErrMsg where.** 
1860: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1870: 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  () does not..*/.
1880: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
1890: 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20  cateTable(Parse 
18a0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
18b0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
18c0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b  t char *zDbase){
18d0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
18e0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
18f0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
1900: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1910: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
1920: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
1930: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
1940: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
1950: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
1960: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
1970: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
1980: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1990: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
19a0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
19b0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
19c0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
19d0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
19e0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
19f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a00: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1a10: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1a20: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1a30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1a40: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1a50: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1a60: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a80: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
1a90: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
1aa0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
1ab0: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
1ac0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
1ad0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1ae0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1af0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1b00: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1b10: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1b20: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1b30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1b40: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1b50: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1b60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1b70: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1b80: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1b90: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1ba0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
1bb0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
1bc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
1bd0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1be0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1bf0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1c00: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1c10: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1c20: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1c30: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1c40: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1c50: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1c60: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1c70: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1c80: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
1c90: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
1ca0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1cb0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
1cc0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
1cd0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
1ce0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1cf0: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1d00: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1d10: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1d20: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1d30: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
1d40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1d50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1d60: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
1d70: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
1d80: 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1d90: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69  s & SQLITE_Initi
1da0: 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69  alized) || db->i
1db0: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f  nit.busy );.  fo
1dc0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1dd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1de0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1df0: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1e00: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1e10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
1e20: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1e30: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
1e40: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
1e50: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
1e60: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
1e70: 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68  ->aDb[j].idxHash
1e80: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
1e90: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69  zName)+1);.    i
1ea0: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
1eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1ec0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
1ed0: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
1ee0: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
1ef0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
1f00: 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20  dex(Index *p){. 
1f10: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
1f20: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
1f30: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
1f40: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1f50: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1f60: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1f70: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1f80: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1f90: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1fa0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1fb0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1fc0: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
1fd0: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
1fe0: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
1ff0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
2000: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
2010: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
2020: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
2030: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
2040: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
2050: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2060: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
2070: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
2080: 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70   *p){.  Index *p
2090: 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Old;..  assert( 
20a0: 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d  db!=0 && p->zNam
20b0: 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d  e!=0 );.  pOld =
20c0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
20d0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
20e0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e  Db].idxHash, p->
20f0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
2120: 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  )+1, 0);.  if( p
2130: 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d  Old!=0 && pOld!=
2140: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
2150: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2160: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48  aDb[p->iDb].idxH
2170: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
2180: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2190: 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f         strlen(pO
21a0: 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f  ld->zName)+1, pO
21b0: 6c 64 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 49  ld);.  }.  freeI
21c0: 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ndex(p);.}../*.*
21d0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
21e0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  en index from it
21f0: 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  s table, then re
2200: 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  move.** the inde
2210: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
2220: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2230: 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a  free its memory.
2240: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ** structures..*
2250: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2260: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2270: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2280: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2290: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
22a0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
22b0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c  .  int len;..  l
22c0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78  en = strlen(zIdx
22d0: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
22e0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
22f0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  ert(&db->aDb[iDb
2300: 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49 64 78 4e  ].idxHash, zIdxN
2310: 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a  ame, len+1, 0);.
2320: 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
2330: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
2340: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
2350: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
2360: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2370: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
2380: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
2390: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
23a0: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  p;.      for(p=p
23b0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
23c0: 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70  Index; p && p->p
23d0: 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d  Next!=pIndex; p=
23e0: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
23f0: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e    if( p && p->pN
2400: 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ext==pIndex ){. 
2410: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
2420: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
2430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2440: 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e     freeIndex(pIn
2450: 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  dex);.  }.  db->
2460: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2470: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
2480: 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
2490: 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61  l schema informa
24a0: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e  tion from the in
24b0: 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
24c0: 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67  les of.** a sing
24d0: 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  le database.  Th
24e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
24f0: 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20  lled to reclaim 
2500: 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65  memory.** before
2510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6c   the database cl
2520: 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73  oses.  It is als
2530: 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  o called during 
2540: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  a rollback.** if
2550: 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65   there were sche
2560: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
2570: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2580: 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68  n or if a.** sch
2590: 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61  ema-cookie misma
25a0: 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  tch occurs..**.*
25b0: 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e  * If iDb<=0 then
25c0: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
25d0: 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65  nal schema table
25e0: 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
25f0: 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66  se.** files.  If
2600: 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73   iDb>=2 then res
2610: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
2620: 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20  schema for only 
2630: 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69  the.** single fi
2640: 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  le indicated..*/
2650: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
2660: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2670: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2680: 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c  t iDb){.  HashEl
2690: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
26a0: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
26b0: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20  temp2;.  int i, 
26c0: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  j;..  assert( iD
26d0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
26e0: 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  nDb );.  db->fla
26f0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
2700: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72  itialized;.  for
2710: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
2720: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
2730: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2740: 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20  i];.    temp1 = 
2750: 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  pDb->tblHash;.  
2760: 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74    temp2 = pDb->t
2770: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c  rigHash;.    sql
2780: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44  ite3HashInit(&pD
2790: 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  b->trigHash, SQL
27a0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
27b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
27c0: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
27d0: 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  aFKey);.    sqli
27e0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
27f0: 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20  b->idxHash);.   
2800: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2810: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
2820: 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  2); pElem; pElem
2830: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2840: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 73  pElem)){.      s
2850: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
2860: 67 65 72 28 28 54 72 69 67 67 65 72 2a 29 73 71  ger((Trigger*)sq
2870: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2880: 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  em));.    }.    
2890: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
28a0: 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71  (&temp2);.    sq
28b0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
28c0: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c  Db->tblHash, SQL
28d0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
28e0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c   0);.    for(pEl
28f0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2900: 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65  st(&temp1); pEle
2910: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2920: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2930: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2940: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
2950: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2960: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2970: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2980: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2990: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
29a0: 31 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 53 65  1);.    pDb->pSe
29b0: 71 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 44 62  qTab = 0;.    Db
29c0: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
29d0: 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , i, DB_SchemaLo
29e0: 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69  aded);.    if( i
29f0: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
2a00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
2a10: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
2a20: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
2a30: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20  ternChanges;..  
2a40: 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  /* If one or mor
2a50: 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61  e of the auxilia
2a60: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2a70: 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  s has been close
2a80: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d  d,.  ** then rem
2a90: 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68  ove then from th
2aa0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2ab0: 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74  base list.  We t
2ac0: 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70  ake the.  ** opp
2ad0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74  ortunity to do t
2ae0: 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77  his here since w
2af0: 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65  e have just dele
2b00: 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20  ted all of the. 
2b10: 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20   ** schema hash 
2b20: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65  tables and there
2b30: 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  fore do not have
2b40: 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61   to make any cha
2b50: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79  nges.  ** to any
2b60: 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73   of those tables
2b70: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2b80: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2b90: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
2ba0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
2bb0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
2bc0: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
2bd0: 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20    if( pDb->pAux 
2be0: 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78  && pDb->xFreeAux
2bf0: 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78   ) pDb->xFreeAux
2c00: 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20  (pDb->pAux);.   
2c10: 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30     pDb->pAux = 0
2c20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
2c30: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
2c40: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
2c50: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
2c60: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2c70: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
2c80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
2c90: 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  ree(pDb->zName);
2ca0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
2cb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
2cc0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
2cd0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
2ce0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
2cf0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
2d00: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
2d10: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
2d20: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
2d30: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
2d40: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
2d50: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
2d60: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
2d70: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
2d80: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
2d90: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
2da0: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
2db0: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
2dc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
2dd0: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
2de0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
2df0: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
2e00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2e10: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
2e20: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
2e30: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
2e40: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
2e50: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2e70: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
2e80: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
2e90: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
2ea0: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
2eb0: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
2ec0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
2ed0: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
2ee0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
2ef0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
2f00: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
2f10: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
2f20: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2f30: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
2f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2f50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2f60: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
2f70: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
2f80: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
2f90: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2fa0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2fb0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
2fc0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2fd0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  es;.}../*.** Cle
2fe0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
2ff0: 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  mes from a table
3000: 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61   or view..*/.sta
3010: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52  tic void sqliteR
3020: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3030: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3040: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
3050: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
3060: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
3070: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
3080: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c  pTable->aCol; i<
3090: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
30a0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
30b0: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
30c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
30d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
30e0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
30f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
3100: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  ->zType);.  }.  
3110: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3120: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62  e->aCol);.  pTab
3130: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3140: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
3150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
3160: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74  e the memory dat
3170: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  a structures ass
3180: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3190: 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e   given.** Table.
31a0: 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65    No changes are
31b0: 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79   made to disk by
31c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
31d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
31e0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74  e just deletes t
31f0: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
3200: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
3210: 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61  unlink.** the ta
3220: 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ble data structu
3230: 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  re from the hash
3240: 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65   table.  Nor doe
3250: 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66  s it remove.** f
3260: 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d  oreign keys from
3270: 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65   the sqlite.aFKe
3280: 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  y hash table.  B
3290: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
32a0: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
32b0: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
32c0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
32d0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
32e0: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
32f0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
3300: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
3310: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
3320: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
3330: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
3340: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
3350: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
3360: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
3370: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
3380: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
3390: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
33a0: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
33b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
33c0: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
33d0: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
33e0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
33f0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3400: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
3410: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b  ex, *pNext;.  FK
3420: 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78  ey *pFKey, *pNex
3430: 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54  tFKey;..  if( pT
3440: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
3450: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
3460: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
3470: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
3480: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  table.  */.  for
3490: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
34a0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
34b0: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
34c0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
34d0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
34e0: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
34f0: 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62  iDb==pTable->iDb
3500: 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62   || (pTable->iDb
3510: 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  ==0 && pIndex->i
3520: 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71  Db==1) );.    sq
3530: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
3540: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
3550: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3560: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3570: 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  Y.  /* Delete al
3580: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
3590: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
35a0: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
35b0: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
35c0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
35d0: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
35e0: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
35f0: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
3600: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
3610: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
3620: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
3630: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
3640: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
3650: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
3660: 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62  ( pTable->iDb<db
3670: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
3680: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
3690: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54  Find(&db->aDb[pT
36a0: 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  able->iDb].aFKey
36b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
36d0: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
36e0: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
36f0: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
3700: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
3710: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
3720: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
3730: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
3740: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
3750: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
3760: 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  s(pTable);.  sql
3770: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
3780: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
3790: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f  Free(pTable->zCo
37a0: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
37b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
37c0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
37d0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
37e0: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
37f0: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
3800: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
3810: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
3820: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
3830: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
3840: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
3850: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
3860: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
3870: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3880: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3890: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
38a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
38b0: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
38c0: 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c  *p;.  FKey *pF1,
38d0: 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62   *pF2;.  Db *pDb
38e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
38f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3900: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
3910: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
3920: 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a  t( zTabName && z
3930: 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  TabName[0] );.  
3940: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3950: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
3960: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
3970: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  b->tblHash, zTab
3980: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61  Name, strlen(zTa
3990: 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  bName)+1, 0);.  
39a0: 69 66 28 20 70 20 29 7b 0a 23 69 66 6e 64 65 66  if( p ){.#ifndef
39b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
39c0: 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72  EIGN_KEY.    for
39d0: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
39e0: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
39f0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
3a00: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
3a10: 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  pF1->zTo) + 1;. 
3a20: 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74       pF2 = sqlit
3a30: 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d  e3HashFind(&pDb-
3a40: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
3a50: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66  , nTo);.      if
3a60: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
3a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
3a80: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46  hInsert(&pDb->aF
3a90: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
3aa0: 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  To, pF1->pNextTo
3ab0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3ac0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
3ad0: 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74  F2 && pF2->pNext
3ae0: 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70  To!=pF1 ){ pF2=p
3af0: 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20  F2->pNextTo; }. 
3b00: 20 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29         if( pF2 )
3b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 32 2d  {.          pF2-
3b20: 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e  >pNextTo = pF1->
3b30: 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20  pNextTo;.       
3b40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3b50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
3b60: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
3b70: 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  b, p);.  }.  db-
3b80: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
3b90: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
3bb0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
3bc0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
3bd0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
3be0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
3bf0: 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74  en with any quot
3c00: 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20  ations removed. 
3c10: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
3c20: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
3c30: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
3c40: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3c50: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
3c60: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
3c70: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
3c80: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  on..**.** Tokens
3c90: 20 61 72 65 20 72 65 61 6c 6c 79 20 6a 75 73 74   are really just
3ca0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
3cb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
3cc0: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
3cd0: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
3ce0: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
3cf0: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
3d00: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
3d10: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
3d20: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
3d30: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
3d40: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
3d50: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
3d60: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
3d70: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
3d80: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
3d90: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
3da0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
3db0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
3dc0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
3dd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
3de0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
3df0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
3e00: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
3e10: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
3e20: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
3e30: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
3e40: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
3e50: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
3e60: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
3e70: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
3e80: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
3e90: 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  able(Vdbe *v, in
3ea0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
3eb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3ec0: 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
3ed0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3ee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
3ef0: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
3f00: 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65  _ROOT);.  sqlite
3f10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3f20: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
3f30: 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65  0, 5); /* sqlite
3f40: 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63 6f  _master has 5 co
3f50: 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  lumns */.}../*.*
3f60: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61  * The token *pNa
3f70: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
3f80: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
3f90: 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e  se (either "main
3fa0: 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f  " or.** "temp" o
3fb0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
3fc0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
3fd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3fe0: 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  rns the.** index
3ff0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
4000: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
4010: 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68  b[], or -1 if th
4020: 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64  e named db .** d
4030: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
4040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
4050: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
4060: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4070: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
4080: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
4090: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ber */.  int n; 
40a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
40b0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
40c0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  in the name */. 
40d0: 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
40e0: 2f 2a 20 41 20 64 61 74 61 62 61 73 65 20 77 68  /* A database wh
40f0: 6f 73 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69  ose name space i
4100: 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
4110: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
4120: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20  e;   /* Name we 
4130: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
4140: 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  r */..  zName = 
4150: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4160: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
4170: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4180: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
4190: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  );.    for(i=(db
41a0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
41b0: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
41c0: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
41d0: 20 20 20 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65      if( n==strle
41e0: 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  n(pDb->zName) &&
41f0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
4200: 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  mp(pDb->zName, z
4210: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
4220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4230: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4240: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Free(zName);.  }
4250: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
4260: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
4270: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
4280: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
4290: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
42a0: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
42b0: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
42c0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
42d0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
42e0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
42f0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
4300: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
4310: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
4320: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4330: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
4340: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
4350: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
4360: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
4370: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
4380: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
4390: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
43a0: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
43b0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
43c0: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
43d0: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
43e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
43f0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
4400: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
4410: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
4420: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
4430: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
4440: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
4450: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
4460: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
4470: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4480: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
4490: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
44a0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
44b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
44c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
44d0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
44e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
44f0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
4500: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
4510: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
4520: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
4530: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4540: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
4550: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
4560: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
4570: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
4580: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
4590: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
45a0: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
45b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
45e0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
45f0: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
4600: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4610: 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20  ;..  if( pName2 
4620: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  && pName2->n>0 )
4630: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  {.    assert( !d
4640: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
4650: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4660: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
4670: 20 66 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d   findDb(db, pNam
4680: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
4690: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
46a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
46b0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
46c0: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
46d0: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
46e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
46f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4710: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
4720: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
4730: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
4740: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
4750: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
4760: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
4770: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
4780: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4790: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
47a0: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
47b0: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
47c0: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
47d0: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
47e0: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
47f0: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
4800: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
4810: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
4820: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
4830: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
4840: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
4850: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
4860: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
4870: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
4880: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
4890: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
48a0: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
48b0: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
48c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
48d0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
48e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
48f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4900: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4910: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
4920: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
4930: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
4940: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
4950: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
4960: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
4970: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4980: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
4990: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
49a0: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
49b0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
49c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
49d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
49e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
49f0: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
4a00: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
4a10: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
4a20: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
4a30: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
4a40: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
4a50: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
4a60: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
4a70: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
4a80: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
4a90: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
4aa0: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
4ab0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4ac0: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
4ad0: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
4ae0: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
4af0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
4b00: 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61  me.  The.** pSta
4b10: 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  rt token is the 
4b20: 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65  CREATE and pName
4b30: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
4b40: 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a  me.  The isTemp.
4b50: 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ** flag is true 
4b60: 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f  if the table sho
4b70: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
4b80: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
4b90: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
4ba0: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68  instead of in th
4bb0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
4bc0: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e  file.  This is n
4bd0: 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65  ormally the case
4be0: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45  .** when the "TE
4bf0: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
4c00: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
4c10: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
4c20: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
4c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
4c40: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
4c50: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
4c60: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
4c70: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
4c80: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
4c90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4ca0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
4cb0: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
4cc0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
4cd0: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
4ce0: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
4cf0: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
4d00: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
4d10: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
4d20: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
4d30: 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  the sqlite3EndTa
4d40: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ble() routine.**
4d50: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
4d60: 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74  mplete the const
4d70: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ruction of the n
4d80: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e  ew table record.
4d90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4da0: 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61  StartTable(.  Pa
4db0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
4dc0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
4dd0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
4de0: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43  art,   /* The "C
4df0: 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a  REATE" token */.
4e00: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
4e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
4e20: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
4e30: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
4e40: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
4e50: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
4e60: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
4e70: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4e80: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
4e90: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
4ea0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
4eb0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
4ec0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20 20 20  .  int isView   
4ed0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4ee0: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
4ef0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
4f00: 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ble;.  Index *pI
4f10: 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  dx;.  char *zNam
4f20: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
4f30: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
4f40: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
4f50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4f60: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
4f70: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
4f80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
4f90: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
4fa0: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
4fb0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
4fc0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
4fd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
4fe0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
4ff0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
5000: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
5010: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
5020: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5030: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
5040: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
5050: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
5060: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5070: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5080: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
5090: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
50a0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
50b0: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
50c0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
50d0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
50e0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
50f0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
5100: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
5110: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5120: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
5130: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5140: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
5150: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
5160: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5170: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5180: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
5190: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
51a0: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
51b0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
51c0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
51d0: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
51e0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
51f0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5200: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5210: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
5220: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
5230: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
5240: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
5250: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
5260: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
5270: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
5280: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
5290: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
52a0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
52b0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
52c0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
52d0: 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 69 44  if( isTemp && iD
52e0: 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  b>1 ){.    /* If
52f0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
5300: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
5310: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
5320: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ified */.    sql
5330: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5340: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
5350: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
5360: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
5370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5380: 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
5390: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
53a0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
53b0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
53c0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
53d0: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
53e0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
53f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5400: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5410: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5420: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5430: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5440: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5450: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5460: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5470: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5490: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
54a0: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
54b0: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
54c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
54d0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
54e0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
54f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5500: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5510: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
5520: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5530: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
5540: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5550: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5560: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
5570: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
5580: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
5590: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
55a0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
55b0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
55c0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
55d0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
55e0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
55f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5600: 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
5610: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5620: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5630: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
5640: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5650: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5660: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
5670: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
5680: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
5690: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
56a0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
56b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
56c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
56d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
56e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
56f0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
5700: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
5710: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
5720: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
5730: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
5740: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
5750: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
5760: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
5770: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20  it does..  */.  
5780: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
5790: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
57a0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
57b0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
57c0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54  _error;.  }.  pT
57d0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
57e0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
57f0: 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e, db->aDb[iDb].
5800: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  zName);.  if( pT
5810: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
5820: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5830: 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c  se, "table %T al
5840: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
5850: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
5860: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
5870: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  r;.  }.  if( (pI
5880: 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  dx = sqlite3Find
5890: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
58a0: 20 30 29 29 21 3d 30 20 26 26 20 0a 20 20 20 20   0))!=0 && .    
58b0: 20 20 28 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64    ( iDb==0 || !d
58c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
58d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
58e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
58f0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
5900: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
5910: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  ", zName);.    g
5920: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5930: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
5940: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
5950: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
5960: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
5970: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  e==0 ){.    pPar
5980: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
5990: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73  NOMEM;.    pPars
59a0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
59b0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
59c0: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
59d0: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
59e0: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  me;.  pTable->nC
59f0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
5a00: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
5a10: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
5a20: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ;.  pTable->pInd
5a30: 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ex = 0;.  pTable
5a40: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69  ->iDb = iDb;.  i
5a50: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
5a60: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65  able ) sqlite3De
5a70: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50  leteTable(db, pP
5a80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
5a90: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
5aa0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
5ab0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
5ac0: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
5ad0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
5ae0: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
5af0: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
5b00: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
5b10: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
5b20: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
5b30: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
5b40: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
5b50: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
5b60: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
5b70: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
5b80: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
5b90: 45 4d 45 4e 54 0a 20 20 69 66 28 20 73 74 72 63  EMENT.  if( strc
5ba0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5bb0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
5bc0: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  ){.    db->aDb[i
5bd0: 44 62 5d 2e 70 53 65 71 54 61 62 20 3d 20 70 54  Db].pSeqTab = pT
5be0: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
5bf0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
5c00: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
5c10: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
5c20: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
5c30: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
5c40: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
5c50: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
5c60: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
5c70: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
5c80: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
5c90: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
5ca0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
5cb0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
5cc0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
5cd0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
5ce0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
5cf0: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
5d00: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
5d10: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
5d20: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
5d30: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
5d40: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
5d50: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
5d60: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
5d70: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
5d80: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5d90: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
5da0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
5db0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
5dc0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
5dd0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5de0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
5df0: 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 73 71 6c  int lbl;.    sql
5e00: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5e10: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5e20: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
5e30: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
5e40: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
5e50: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5e60: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
5e70: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
5e80: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
5e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ea0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
5eb0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
5ec0: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
5ed0: 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73  t */.    lbl = s
5ee0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5ef0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
5f00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5f10: 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a  OP_If, 0, lbl);.
5f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
5f40: 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  er, db->file_for
5f50: 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
5f60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5f70: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
5f80: 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 1);.    sqli
5f90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5fa0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
5fb0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  enc, 0);.    sql
5fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5fd0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
5fe0: 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 4);.    sqli
5ff0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6000: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20  bel(v, lbl);..  
6010: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
6020: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
6030: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
6040: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6050: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
6060: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
6070: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
6080: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
6090: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
60a0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
60b0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
60c0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
60d0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
60e0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
60f0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6100: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6110: 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  y is left on the
6120: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
6130: 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  k..    ** The ro
6140: 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65  wid value is nee
6150: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
6160: 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  that sqlite3EndT
6170: 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  able will.    **
6180: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
6190: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
61a0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69  _OMIT_VIEW.    i
61b0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
61c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
61d0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
61e0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, 0, 0);.    }e
61f0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
6200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6210: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
6220: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
6230: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6240: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6250: 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  able(v, iDb);.  
6260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6270: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
6280: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
6290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
62a0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
62b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
62c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
62d0: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
62e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62f0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
6300: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6320: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
6330: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6340: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
6350: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  l, 1, 0);.  }.. 
6360: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d   /* Normal (non-
6370: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a  error) return. *
6380: 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  /.  return;..  /
6390: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
63a0: 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65  curs, we jump he
63b0: 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c  re */.begin_tabl
63c0: 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  e_error:.  sqlit
63d0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
63e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
63f0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
6400: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
6410: 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  wo strings in a 
6420: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
6430: 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69   manner..** It i
6440: 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  s slightly faste
6450: 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73  r than calling s
6460: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20  qlite3StrICmp() 
6470: 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a  directly, but.**
6480: 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72   produces larger
6490: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52   code..**.** WAR
64a0: 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f  NING: This macro
64b0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
64c0: 6c 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63  le with the strc
64d0: 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a  mp() family. It.
64e0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  ** returns true 
64f0: 69 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e  if the two strin
6500: 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74  gs are equal, ot
6510: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
6520: 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d  /.#define STRICM
6530: 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74  P(x, y) (\.sqlit
6540: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
6550: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6560: 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69  )(x)]==   \.sqli
6570: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
6580: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  *(unsigned char 
6590: 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20  *)(y)]     \.&& 
65a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28  sqlite3StrICmp((
65b0: 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29  x)+1,(y)+1)==0 )
65c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
65d0: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
65e0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
65f0: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
6600: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
6610: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
6620: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
6630: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
6640: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
6650: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6660: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
6670: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
6680: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
6690: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
66a0: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
66b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
66c0: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
66d0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
66e0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
66f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6700: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
6710: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
6720: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
6730: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
6740: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
6750: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
6760: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
6770: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6780: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
6790: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
67a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
67b0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
67c0: 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c    if( STRICMP(z,
67d0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
67e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
67f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6800: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
6810: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
6820: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
6830: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
6840: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6850: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
6860: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
6870: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
6880: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
6890: 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f  eRealloc( p->aCo
68a0: 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  l, (p->nCol+8)*s
68b0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
68c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
68d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
68e0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
68f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
6900: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
6910: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
6920: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
6930: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
6940: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
6950: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
6960: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
6970: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
6980: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
6990: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
69a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
69b0: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
69c0: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
69d0: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
69e0: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
69f0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
6a00: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
6a10: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
6a20: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
6a30: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
6a40: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
6a50: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
6a60: 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20    pCol->pColl = 
6a70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
6a80: 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  tColl;.  p->nCol
6a90: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
6aa0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6ab0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
6ac0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
6ad0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
6ae0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
6af0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
6b00: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
6b10: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
6b20: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
6b30: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
6b40: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
6b50: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
6b60: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
6b70: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
6b80: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
6b90: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
6ba0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
6bb0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
6bc0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
6bd0: 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70   i;.  if( (p = p
6be0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6bf0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
6c00: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
6c10: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e    if( i>=0 ) p->
6c20: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20  aCol[i].notNull 
6c30: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  = onError;.}../*
6c40: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
6c50: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
6c60: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
6c70: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
6c80: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
6c90: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
6ca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6cb0: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
6cc0: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
6cd0: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
6ce0: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
6cf0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
6d00: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
6d10: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
6d20: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
6d30: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
6d40: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
6d50: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
6d60: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
6d70: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
6d80: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
6d90: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
6da0: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
6db0: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
6dc0: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
6dd0: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
6de0: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
6df0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
6e00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
6e10: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
6e20: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
6e50: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
6e60: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
6e70: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
6e80: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
6e90: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
6ea0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
6eb0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
6ec0: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
6ed0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
6ee0: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
6ef0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
6f00: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
6f10: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
6f20: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
6f30: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
6f40: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
6f50: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
6f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
6f70: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
6f80: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
6f90: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
6fa0: 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  e){.  u32 h = 0;
6fb0: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
6fc0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
6fd0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
6fe0: 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a  ed char *zIn = z
6ff0: 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Type;.  const un
7000: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e  signed char *zEn
7010: 64 20 3d 20 28 7a 49 6e 2b 6e 54 79 70 65 29 3b  d = (zIn+nType);
7020: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
7030: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
7040: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7050: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
7060: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
7070: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
7080: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
7090: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
70b0: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
70c0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
70d0: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
70e0: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
70f0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7100: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
7110: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
7120: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7130: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7140: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
7150: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
7160: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
7170: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
7180: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7190: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
71a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
71b0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
71c0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
71d0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
71e0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
71f0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
7200: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
7210: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7220: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 65  AFF_NONE;.    }e
7230: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
7240: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
7250: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
7260: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
7270: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7280: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
7290: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
72a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
72b0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
72c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
72d0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
72e0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
72f0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7300: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7310: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7320: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
7330: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
7340: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
7350: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
7360: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
7370: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
7380: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
7390: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
73a0: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
73b0: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
73c0: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
73d0: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
73e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
73f0: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
7400: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
7410: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
7420: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
7430: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
7440: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
7450: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
7460: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
7470: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7480: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54  Token *pFirst, T
7490: 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20  oken *pLast){.  
74a0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
74b0: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  i, j;.  int n;. 
74c0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73   char *z;.  cons
74d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
74e0: 2a 7a 49 6e 3b 0a 0a 20 20 43 6f 6c 75 6d 6e 20  *zIn;..  Column 
74f0: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
7500: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7510: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7520: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
7530: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
7540: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
7550: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 7a  &p->aCol[i];.  z
7560: 49 6e 20 3d 20 70 46 69 72 73 74 2d 3e 7a 3b 0a  In = pFirst->z;.
7570: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
7580: 20 28 70 4c 61 73 74 2d 3e 7a 20 2d 20 7a 49 6e   (pLast->z - zIn
7590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
75a0: 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20  l->zType==0 );. 
75b0: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
75c0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
75d0: 61 77 28 6e 2b 31 29 3b 0a 20 20 69 66 28 20 7a  aw(n+1);.  if( z
75e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
75f0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
7600: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
7610: 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66  = zIn[i];.    if
7620: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
7630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a  ontinue;.    z[j
7640: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
7650: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d  [j] = 0;.  pCol-
7660: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
7670: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
7680: 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  z, n);.}../*.** 
7690: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
76a0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
76b0: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
76c0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
76d0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
76e0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
76f0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7700: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
7710: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
7720: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
7730: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
7740: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
7750: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
7760: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
7770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7780: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
7790: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
77a0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
77b0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
77c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
77d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
77e0: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
77f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7800: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
7810: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
7820: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
7830: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7840: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7850: 0a 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61  .  pCol = &(p->a
7860: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
7870: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
7880: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
7890: 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
78a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
78b0: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
78c0: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
78d0: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
78e0: 74 22 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  t",.        pCol
78f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ->zName);.  }els
7900: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
7910: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
7920: 44 66 6c 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  Dflt);.    pCol-
7930: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
7940: 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a  ExprDup(pExpr);.
7950: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
7960: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a  rDelete(pExpr);.
7970: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
7980: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
7990: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
79a0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
79b0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
79c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
79d0: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
79e0: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
79f0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
7a00: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
7a10: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
7a20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
7a30: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
7a40: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
7a50: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
7a60: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
7a70: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
7a80: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
7a90: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
7aa0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
7ab0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
7ac0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
7ad0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
7ae0: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
7af0: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
7b00: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
7b10: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
7b20: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
7b30: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
7b40: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
7b50: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
7b60: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
7b70: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
7b80: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
7b90: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
7ba0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
7bb0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
7bc0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
7bd0: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
7be0: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
7bf0: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
7c00: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
7c10: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
7c20: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
7c30: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
7c40: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
7c50: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
7c60: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
7c70: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
7c80: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
7c90: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
7ca0: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
7cb0: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
7cc0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
7cd0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
7ce0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
7cf0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
7d00: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
7d10: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
7d20: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
7d30: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
7d40: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
7d50: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
7d60: 74 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20  t autoInc       
7d70: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
7d80: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
7d90: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
7da0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
7db0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
7dc0: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
7dd0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
7de0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
7df0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
7e00: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
7e10: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
7e20: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b  b->hasPrimKey ){
7e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7e40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
7e50: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
7e60: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
7e70: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
7e80: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
7e90: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
7ea0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
7eb0: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
7ec0: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69  y = 1;.  if( pLi
7ed0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
7ee0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
7ef0: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
7f00: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
7f10: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
7f20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7f30: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7f40: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
7f50: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
7f60: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
7f70: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7f80: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
7f90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
7fa0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
7fb0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
7fc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7fe0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
7ff0: 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d  ab->nCol ) pTab-
8000: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
8010: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  imKey = 1;.    }
8020: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
8030: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
8040: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
8050: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
8060: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
8070: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
8080: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
8090: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
80a0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
80b0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
80c0: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
80d0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
80e0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
80f0: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
8100: 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e      pTab->autoIn
8110: 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d  c = autoInc;.  }
8120: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
8130: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
8140: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
8150: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
8160: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8170: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
8180: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
8190: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
81a0: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
81b0: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
81c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
81d0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
81e0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
81f0: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
8200: 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  0, 0);.    pList
8210: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
8220: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
8230: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8240: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
8250: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
8260: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
8270: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
8280: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8290: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
82a0: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
82b0: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
82c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
82d0: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
82e0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
82f0: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
8300: 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65   nType){.  Table
8310: 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49   *p;.  Index *pI
8320: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
8330: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Coll;.  int i;..
8340: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8350: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
8360: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
8370: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70   p->nCol-1;..  p
8380: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
8390: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
83a0: 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  se, zType, nType
83b0: 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  );.  p->aCol[i].
83c0: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a  pColl = pColl;..
83d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
83e0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
83f0: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
8400: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
8410: 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e  ype>",.  ** then
8420: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
8430: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
8440: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
8450: 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  efore the.  ** c
8460: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
8470: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
8480: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
8490: 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  he case..  */.  
84a0: 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49  for(pIdx = p->pI
84b0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
84c0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
84d0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
84e0: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
84f0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
8500: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49  olumn[0]==i ) pI
8510: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
8520: 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[0] = pColl;.  
8530: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
8540: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
8550: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 64  entry from the d
8560: 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20  b.aCollSeq hash 
8570: 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65 6e  table. If the en
8580: 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  try.** specified
8590: 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e   by zName and nN
85a0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  ame is not found
85b0: 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 27   and parameter '
85c0: 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74 72  create' is.** tr
85d0: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
85e0: 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74 68  a new entry. Oth
85f0: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
8600: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70  LL..**.** Each p
8610: 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69 6e  ointer stored in
8620: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43 6f   the sqlite3.aCo
8630: 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65  llSeq hash table
8640: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20   contains an.** 
8650: 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20 43  array of three C
8660: 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72 65  ollSeq structure
8670: 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20  s. The first is 
8680: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8690: 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66 65  quence.** preffe
86a0: 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20  rred for UTF-8, 
86b0: 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d 31  the second UTF-1
86c0: 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68 69  6le, and the thi
86d0: 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a  rd UTF-16be..**.
86e0: 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64 69  ** Stored immedi
86f0: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
8700: 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  three collation 
8710: 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20 63  sequences is a c
8720: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  opy of.** the co
8730: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8740: 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65 72   name. A pointer
8750: 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20   to this string 
8760: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
8770: 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  each collation s
8780: 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75 72  equence structur
8790: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
87a0: 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c 53  lSeq * findCollS
87b0: 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69 74  eqEntry(.  sqlit
87c0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
87d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
87e0: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
87f0: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
8800: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66  Seq *pColl;.  if
8810: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
8820: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
8830: 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  );.  pColl = sql
8840: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
8850: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
8860: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66  e, nName);..  if
8870: 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72  ( 0==pColl && cr
8880: 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  eate ){.    pCol
8890: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
88a0: 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  ( 3*sizeof(*pCol
88b0: 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29  l) + nName + 1 )
88c0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
88d0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
88e0: 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20   *pDel = 0;.    
88f0: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65    pColl[0].zName
8900: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
8910: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
8920: 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [0].enc = SQLITE
8930: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f  _UTF8;.      pCo
8940: 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63  ll[1].zName = (c
8950: 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a  har*)&pColl[3];.
8960: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65        pColl[1].e
8970: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
8980: 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  6LE;.      pColl
8990: 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [2].zName = (cha
89a0: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
89b0: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63      pColl[2].enc
89c0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
89d0: 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  E;.      memcpy(
89e0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  pColl[0].zName, 
89f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
8a00: 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e       pColl[0].zN
8a10: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
8a20: 20 20 20 20 20 20 70 44 65 6c 20 3d 20 73 71 6c        pDel = sql
8a30: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
8a40: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43  db->aCollSeq, pC
8a50: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e  oll[0].zName, nN
8a60: 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 0a 20 20  ame, pColl);..  
8a70: 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
8a80: 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 63 63  oc() failure occ
8a90: 75 72 65 64 20 69 6e 20 73 71 6c 69 74 65 33 48  ured in sqlite3H
8aa0: 61 73 68 49 6e 73 65 72 74 28 29 2c 20 69 74 20  ashInsert(), it 
8ab0: 77 69 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 72  will .      ** r
8ac0: 65 74 75 72 6e 20 74 68 65 20 70 43 6f 6c 6c 20  eturn the pColl 
8ad0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 64 65  pointer to be de
8ae0: 6c 65 74 65 64 20 28 62 65 63 61 75 73 65 20 69  leted (because i
8af0: 74 20 77 61 73 6e 27 74 20 61 64 64 65 64 0a 20  t wasn't added. 
8b00: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 68       ** to the h
8b10: 61 73 68 20 74 61 62 6c 65 29 2e 0a 20 20 20 20  ash table)..    
8b20: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
8b30: 74 28 20 21 70 44 65 6c 20 7c 7c 20 28 73 71 6c  t( !pDel || (sql
8b40: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
8b50: 65 64 20 26 26 20 70 44 65 6c 3d 3d 70 43 6f 6c  ed && pDel==pCol
8b60: 6c 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l) );.      sqli
8b70: 74 65 46 72 65 65 28 70 44 65 6c 29 3b 0a 20 20  teFree(pDel);.  
8b80: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8b90: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
8ba0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
8bb0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46   points to a UTF
8bc0: 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
8bd0: 67 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f  g nName bytes lo
8be0: 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ng..** Return th
8bf0: 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74  e CollSeq* point
8c00: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61  er for the colla
8c10: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
8c20: 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72  med zName.** for
8c30: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65   the encoding 'e
8c40: 6e 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74  nc' from the dat
8c50: 61 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a  abase 'db'..**.*
8c60: 2a 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73  * If the entry s
8c70: 70 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20  pecified is not 
8c80: 66 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74  found and 'creat
8c90: 65 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  e' is true, then
8ca0: 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77   create a.** new
8cb0: 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69   entry.  Otherwi
8cc0: 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  se return NULL..
8cd0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
8ce0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a  te3FindCollSeq(.
8cf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
8d00: 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74   u8 enc,.  const
8d10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
8d20: 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  int nName,.  int
8d30: 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c   create.){.  Col
8d40: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69  lSeq *pColl = fi
8d50: 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64  ndCollSeqEntry(d
8d60: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
8d70: 20 63 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65   create);.  asse
8d80: 72 74 28 20 53 51 4c 49 54 45 5f 55 54 46 38 3d  rt( SQLITE_UTF8=
8d90: 3d 31 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46  =1 && SQLITE_UTF
8da0: 31 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49 54  16LE==2 && SQLIT
8db0: 45 5f 55 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a  E_UTF16BE==3 );.
8dc0: 20 20 61 73 73 65 72 74 28 20 65 6e 63 3e 3d 53    assert( enc>=S
8dd0: 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 65 6e  QLITE_UTF8 && en
8de0: 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c<=SQLITE_UTF16B
8df0: 45 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  E );.  if( pColl
8e00: 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d   ) pColl += enc-
8e10: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  1;.  return pCol
8e20: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  l;.}../*.** Invo
8e30: 6b 65 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f  ke the 'collatio
8e40: 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61  n needed' callba
8e50: 63 6b 20 74 6f 20 72 65 71 75 65 73 74 20 61 20  ck to request a 
8e60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8e70: 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  ce.** in the dat
8e80: 61 62 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64  abase text encod
8e90: 69 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d  ing of name zNam
8ea0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
8eb0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  .** If the colla
8ec0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f  tion sequence.*/
8ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c  .static void cal
8ee0: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69  lCollNeeded(sqli
8ef0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
8f00: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
8f10: 6e 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74  nName){.  assert
8f20: 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  ( !db->xCollNeed
8f30: 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c  ed || !db->xColl
8f40: 4e 65 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66  Needed16 );.  if
8f50: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
8f60: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
8f70: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f  );.  if( db->xCo
8f80: 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  llNeeded ){.    
8f90: 63 68 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20  char *zExternal 
8fa0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
8fb0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
8fc0: 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61     if( !zExterna
8fd0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
8fe0: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28  db->xCollNeeded(
8ff0: 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
9000: 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d  rg, db, (int)db-
9010: 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29  >enc, zExternal)
9020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
9030: 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d  (zExternal);.  }
9040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9050: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
9060: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
9070: 31 36 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63  16 ){.    char c
9080: 6f 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b  onst *zExternal;
9090: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
90a0: 75 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74  ue *pTmp = sqlit
90b0: 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61  e3GetTransientVa
90c0: 6c 75 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  lue(db);.    sql
90d0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
90e0: 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c  pTmp, -1, zName,
90f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
9100: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9110: 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71    zExternal = sq
9120: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
9130: 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Tmp, SQLITE_UTF1
9140: 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66  6NATIVE);.    if
9150: 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72  ( !zExternal ) r
9160: 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78  eturn;.    db->x
9170: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d  CollNeeded16(db-
9180: 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  >pCollNeededArg,
9190: 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e   db, (int)db->en
91a0: 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20  c, zExternal);. 
91b0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
91c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
91d0: 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
91e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
91f0: 72 79 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69  ry fails to deli
9200: 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69  ver a.** collati
9210: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  on function in t
9220: 68 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67  he best encoding
9230: 20 62 75 74 20 74 68 65 72 65 20 6d 61 79 20 62   but there may b
9240: 65 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73  e other versions
9250: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c  .** of this coll
9260: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28  ation function (
9270: 66 6f 72 20 6f 74 68 65 72 20 74 65 78 74 20 65  for other text e
9280: 6e 63 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61  ncodings) availa
9290: 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20  ble. Use one.** 
92a0: 6f 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64  of these instead
92b0: 20 69 66 20 74 68 65 79 20 65 78 69 73 74 2e 20   if they exist. 
92c0: 41 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d  Avoid a UTF-8 <-
92d0: 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73  > UTF-16 convers
92e0: 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62  ion if.** possib
92f0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
9300: 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50  t synthCollSeq(P
9310: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
9320: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
9330: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
9340: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43  ;.  char *z = pC
9350: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e  oll->zName;.  in
9360: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  t n = strlen(z);
9370: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9380: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
9390: 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63  nt i;.  static c
93a0: 6f 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d  onst u8 aEnc[] =
93b0: 20 7b 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   { SQLITE_UTF16B
93c0: 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  E, SQLITE_UTF16L
93d0: 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d  E, SQLITE_UTF8 }
93e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
93f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c  ; i++){.    pCol
9400: 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  l2 = sqlite3Find
9410: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e 63  CollSeq(db, aEnc
9420: 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20  [i], z, n, 0);. 
9430: 20 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78     if( pColl2->x
9440: 43 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cmp!=0 ){.      
9450: 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43  memcpy(pColl, pC
9460: 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c  oll2, sizeof(Col
9470: 6c 53 65 71 29 29 3b 0a 20 20 20 20 20 20 72 65  lSeq));.      re
9480: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9490: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
94a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
94b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
94c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
94d0: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
94e0: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73  n sequence: %.*s
94f0: 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20  ", n, z);.  }.  
9500: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9520: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
9530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9540: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c  called on a coll
9550: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62  ation sequence b
9560: 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64  efore it is used
9570: 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61   to.** check tha
9580: 74 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e  t it is defined.
9590: 20 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f   An undefined co
95a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
95b0: 20 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20   exists when.** 
95c0: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  a database is lo
95d0: 61 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69  aded that contai
95e0: 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ns references to
95f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9600: 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  nces.** that hav
9610: 65 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e  e not been defin
9620: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72  ed by sqlite3_cr
9630: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  eate_collation()
9640: 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72   etc..**.** If r
9650: 65 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  equired, this ro
9660: 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20  utine calls the 
9670: 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65  'collation neede
9680: 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a  d' callback to.*
9690: 2a 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69  * request a defi
96a0: 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  nition of the co
96b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
96c0: 2e 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27  . If this doesn'
96d0: 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65  t work, .** an e
96e0: 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74  quivalent collat
96f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61  ing sequence tha
9700: 74 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e  t uses a text en
9710: 63 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74  coding different
9720: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  .** from the mai
9730: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75  n database is su
9740: 62 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e  bstituted, if on
9750: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  e is available..
9760: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
9770: 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  eckCollSeq(Parse
9780: 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65   *pParse, CollSe
9790: 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28  q *pColl){.  if(
97a0: 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c   pColl && !pColl
97b0: 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a  ->xCmp ){.    /*
97c0: 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   No collation se
97d0: 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74  quence of this t
97e0: 79 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63  ype for this enc
97f0: 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65  oding is registe
9800: 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c  red..    ** Call
9810: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9820: 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66  actory to see if
9830: 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75   it can supply u
9840: 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20  s with one..    
9850: 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e  */.    callCollN
9860: 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62  eeded(pParse->db
9870: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  , pColl->zName, 
9880: 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e  strlen(pColl->zN
9890: 61 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ame));.    if( !
98a0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73  pColl->xCmp && s
98b0: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72  ynthCollSeq(pPar
98c0: 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, pColl) ){.  
98d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
98e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
98f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
9900: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9910: 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63  Call sqlite3Chec
9920: 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61  kCollSeq() for a
9930: 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ll collating seq
9940: 75 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64  uences in an ind
9950: 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ex,.** in order 
9960: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61  to verify that a
9970: 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ll the necessary
9980: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
9990: 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64  nces are.** load
99a0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
99b0: 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c  e3CheckIndexColl
99c0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
99d0: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
99e0: 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20  .  if( pIdx ){. 
99f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
9a00: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
9a10: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
9a20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
9a30: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
9a40: 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  se, pIdx->keyInf
9a50: 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20  o.aColl[i]) ){. 
9a60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9a70: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9a80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9aa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9ab0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9ac0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
9ad0: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
9ae0: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
9af0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
9b00: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
9b10: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
9b20: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
9b30: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
9b40: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
9b50: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
9b60: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
9b70: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
9b80: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
9b90: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
9ba0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9bb0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
9bc0: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
9bd0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
9be0: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
9bf0: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
9c00: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
9c10: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
9c20: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
9c30: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
9c40: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
9c50: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
9c60: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
9c70: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
9c80: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
9c90: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
9ca0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
9cb0: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
9cc0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
9cd0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
9ce0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9cf0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
9d00: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c   pParse..*/.Coll
9d10: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
9d20: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
9d30: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9d40: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
9d50: 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63  nName){.  u8 enc
9d60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
9d70: 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  nc;.  u8 initbus
9d80: 79 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  y = pParse->db->
9d90: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
9da0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
9db0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
9dc0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63  (pParse->db, enc
9dd0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
9de0: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
9df0: 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65   nName<0 ) nName
9e00: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
9e10: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
9e20: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
9e30: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
9e40: 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61  .    /* No colla
9e50: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
9e60: 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74   this type for t
9e70: 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  his encoding is 
9e80: 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20  registered..    
9e90: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c  ** Call the coll
9ea0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f  ation factory to
9eb0: 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73   see if it can s
9ec0: 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e  upply us with on
9ed0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
9ee0: 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61  llCollNeeded(pPa
9ef0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
9f00: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c  nName);.    pCol
9f10: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
9f20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64  ollSeq(pParse->d
9f30: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
9f40: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
9f50: 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c  ( pColl && !pCol
9f60: 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 20  l->xCmp ){.     
9f70: 20 2f 2a 20 54 68 65 72 65 20 6d 61 79 20 62 65   /* There may be
9f80: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68   a version of th
9f90: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
9fa0: 65 6e 63 65 20 74 68 61 74 20 72 65 71 75 69 72  ence that requir
9fb0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  es.      ** tran
9fc0: 73 6c 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 20  slation between 
9fd0: 65 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61 72 63  encodings. Searc
9fe0: 68 20 66 6f 72 20 69 74 20 77 69 74 68 20 73 79  h for it with sy
9ff0: 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20  nthCollSeq()..  
a000: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
a010: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50   synthCollSeq(pP
a020: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a  arse, pColl) ){.
a030: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
a040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a050: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
a060: 68 69 6e 67 20 68 61 73 20 62 65 65 6e 20 66 6f  hing has been fo
a070: 75 6e 64 2c 20 77 72 69 74 65 20 74 68 65 20 65  und, write the e
a080: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
a090: 6f 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 69 66  o pParse */.  if
a0a0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
a0b0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
a0c0: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 69  ->xCmp) ){.    i
a0d0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
a0e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
a0f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a100: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
a110: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
a120: 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a   %.*s", nName, z
a130: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
a140: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
a150: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
a160: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
a170: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
a180: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
a190: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
a1a0: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
a1b0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
a1c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
a1d0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
a1e0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
a1f0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
a200: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
a210: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
a220: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
a230: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
a240: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
a250: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
a260: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
a270: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
a280: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
a290: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
a2a0: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
a2b0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
a2c0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
a2d0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
a2e0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
a2f0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
a300: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
a310: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
a320: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
a330: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
a340: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
a350: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
a360: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
a370: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
a380: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
a390: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
a3a0: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
a3b0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
a3c0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
a3d0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
a3e0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
a3f0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
a400: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
a410: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
a420: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
a430: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a440: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  3ChangeCookie(sq
a450: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
a460: 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *v, int iDb){.  
a470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a480: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a490: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
a4a0: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29  ema_cookie+1, 0)
a4b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a4c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
a4d0: 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d  okie, iDb, 0);.}
a4e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
a4f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
a500: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
a510: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
a520: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
a530: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
a540: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
a550: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
a560: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
a570: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
a580: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a  l terminator..**
a590: 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
a5a0: 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65   is conservative
a5b0: 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c  .  It might be l
a5c0: 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20  arger that what 
a5d0: 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65  is.** really nee
a5e0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
a5f0: 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63  nt identLength(c
a600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a610: 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d   int n;.  for(n=
a620: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
a630: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22  {.    if( *z=='"
a640: 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a  ' ){ n++; }.  }.
a650: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a    return n + 2;.
a660: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
a670: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74  n identifier ont
a680: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
a690: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
a6a0: 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61  Add.** quote cha
a6b0: 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65  racters as neede
a6c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a6d0: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
a6e0: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
a6f0: 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e  har *zSignedIden
a700: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
a710: 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75  har *zIdent = (u
a720: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53  nsigned char*)zS
a730: 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e  ignedIdent;.  in
a740: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
a750: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
a760: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a770: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a780: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
a790: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
a7a0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
a7b0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
a7c0: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
a7d0: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
a7e0: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
a7f0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
a800: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
a810: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
a820: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
a830: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
a840: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
a850: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a860: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
a870: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
a880: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
a890: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a8a0: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
a8b0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
a8c0: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
a8d0: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
a8e0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
a8f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a900: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
a910: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
a920: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
a930: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
a940: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
a950: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
a960: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
a970: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
a980: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
a990: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
a9a0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
a9b0: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
a9c0: 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  mt(Table *p){.  
a9d0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
a9e0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
a9f0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
aa00: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
aa10: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
aa20: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
aa30: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
aa40: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
aa50: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
aa60: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
aa70: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
aa80: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
aa90: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
aaa0: 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65       n += (strle
aab0: 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  n(z) + 1);.    }
aac0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
aad0: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
aae0: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
aaf0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
ab00: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
ab10: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
ab20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
ab30: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
ab40: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
ab50: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
ab60: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
ab70: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
ab80: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
ab90: 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20  allocRaw( n );. 
aba0: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20   if( zStmt==0 ) 
abb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63  return 0;.  strc
abc0: 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62  py(zStmt, p->iDb
abd0: 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45  ==1 ? "CREATE TE
abe0: 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52  MP TABLE " : "CR
abf0: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
ac00: 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d   k = strlen(zStm
ac10: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
ac20: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
ac30: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
ac40: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
ac50: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
ac60: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
ac70: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
ac80: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
ac90: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
aca0: 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b   strlen(&zStmt[k
acb0: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
acc0: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
acd0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
ace0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
acf0: 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a  if( (z = pCol->z
ad00: 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Type)!=0 ){.    
ad10: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
ad20: 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79   ';.      strcpy
ad30: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a  (&zStmt[k], z);.
ad40: 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65        k += strle
ad50: 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n(z);.    }.  }.
ad60: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
ad70: 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  k], zEnd);.  ret
ad80: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
ad90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ada0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
adb0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
adc0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
add0: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
ade0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
adf0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
ae00: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
ae10: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
ae20: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
ae30: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
ae40: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
ae50: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
ae60: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
ae70: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
ae80: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
ae90: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
aea0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
aeb0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
aec0: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
aed0: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
aee0: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
aef0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
af00: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
af10: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
af20: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
af30: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
af40: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
af50: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
af60: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
af70: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
af80: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
af90: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
afa0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
afb0: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
afc0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
afd0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
afe0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
aff0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
b000: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
b010: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
b020: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
b030: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
b040: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
b050: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
b060: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
b070: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
b080: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
b090: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
b0a0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
b0b0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
b0c0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
b0d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
b0e0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
b0f0: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
b100: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
b110: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
b120: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
b130: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b140: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
b150: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
b160: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
b170: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b180: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
b190: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
b1a0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
b1b0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b1c0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20     /* The final 
b1d0: 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ')' token in the
b1e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
b1f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
b200: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
b210: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
b220: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
b230: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
b240: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
b250: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b260: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
b270: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
b280: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
b290: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
b2a0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
b2b0: 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  n;.  p = pParse-
b2c0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
b2d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
b2e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
b2f0: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
b300: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
b310: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
b320: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
b330: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
b340: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
b350: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
b360: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
b370: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
b380: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
b390: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
b3a0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
b3b0: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
b3c0: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
b3d0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
b3e0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
b3f0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
b400: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
b410: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
b420: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
b430: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
b440: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
b450: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f  b routine.).  */
b460: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
b470: 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74  busy ){.    p->t
b480: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
b490: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
b4a0: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
b4b0: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
b4c0: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
b4d0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
b4e0: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
b4f0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
b500: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
b510: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
b520: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  r.  ** for the n
b530: 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73  ew table entry s
b540: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
b550: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
b560: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
b570: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
b580: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
b590: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
b5a0: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
b5b0: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
b5c0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
b5d0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
b5e0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
b5f0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
b600: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
b610: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
b620: 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
b630: 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
b640: 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
b650: 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
b660: 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
b670: 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
b680: 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
b690: 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
b6a0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
b6b0: 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
b6c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b6d0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
b6e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
b6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b700: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b710: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  0, 0);..    /* C
b720: 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
b730: 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ge for the new t
b740: 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74  able and push it
b750: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
b760: 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68  .    ** A view h
b770: 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20  as no rootpage, 
b780: 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a  so just push a z
b790: 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ero onto the sta
b7a0: 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69  ck for.    ** vi
b7b0: 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ews.  Initialize
b7c0: 20 7a 54 79 70 65 20 61 74 20 74 68 65 20 73 61   zType at the sa
b7d0: 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a  me time..    */.
b7e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
b7f0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
b800: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
b810: 65 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 73 71  e */.      /* sq
b820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b830: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
b840: 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 20 2a 2f  , p->iDb, 0); */
b850: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
b860: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
b870: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
b880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b890: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
b8a0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
b8b0: 69 65 77 20 2a 2f 0a 20 20 20 20 2f 2a 20 20 73  iew */.    /*  s
b8c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b8d0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
b8e0: 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  , 0); */.      z
b8f0: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
b900: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
b910: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
b920: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
b930: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
b940: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
b950: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
b960: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
b970: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
b980: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
b990: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
b9a0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
b9b0: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
b9c0: 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f  ble is on the to
b9d0: 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74  p of the vdbe st
b9e0: 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack..    **.    
b9f0: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
ba00: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
ba10: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
ba20: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
ba30: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
ba40: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
ba50: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
ba60: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
ba70: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
ba80: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
ba90: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
baa0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
bab0: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
bac0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
bad0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bae0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
baf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bb00: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
bb10: 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  , p->iDb, 0);.  
bb20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bb30: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
bb40: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
bb50: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
bb60: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
bb70: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
bb80: 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61   pSelect, SRT_Ta
bb90: 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c  ble, 1, 0, 0, 0,
bba0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
bbb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bbc0: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
bbd0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
bbe0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
bbf0: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
bc00: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
bc10: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
bc20: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
bc30: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
bc40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
bc50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
bc60: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
bc70: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
bc80: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
bc90: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
bca0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
bcb0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
bcc0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
bcd0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
bce0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
bcf0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
bd00: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
bd10: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
bd20: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
bd30: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
bd40: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
bd50: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
bd60: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
bd70: 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
bd80: 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20  bleStmt(p);.    
bd90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
bda0: 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
bdb0: 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 4e   Addr(pParse->sN
bdc0: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  ameToken.z) + 1;
bdd0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
bde0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43  qlite3MPrintf("C
bdf0: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
be00: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
be10: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
be20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
be30: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
be40: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
be50: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
be60: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
be70: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
be80: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
be90: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
bea0: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
beb0: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
bec0: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
bed0: 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77  lected.  The row
bee0: 69 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c  id for the preal
bef0: 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73  located.    ** s
bf00: 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69  lot is the 2nd i
bf10: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
bf20: 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  .  The top of th
bf30: 65 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20  e stack is the. 
bf40: 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
bf50: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
bf60: 65 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69  e (or a 0 if thi
bf70: 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20  s is a view)..  
bf80: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
bf90: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
bfa0: 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
bfb0: 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
bfc0: 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
bfd0: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
bfe0: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
bff0: 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20  e=#0, sql=%Q ". 
c000: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
c010: 69 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62  id=#1",.      db
c020: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e  ->aDb[p->iDb].zN
c030: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
c040: 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20  E(p->iDb),.     
c050: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
c060: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
c070: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
c080: 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
c090: 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
c0a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
c0b0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
c0c0: 20 70 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e 64   p->iDb);..#ifnd
c0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c0e0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
c0f0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
c100: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
c110: 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
c120: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
c130: 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
c140: 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
c150: 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
c160: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
c170: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
c180: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
c190: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
c1a0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 65      if( pDb->pSe
c1b0: 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
c1c0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
c1d0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
c1e0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
c1f0: 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
c200: 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
c210: 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
c220: 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
c230: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
c240: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
c250: 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
c260: 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
c270: 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
c280: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
c290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c2a0: 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
c2b0: 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a  ema, p->iDb, 0,.
c2c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
c2d0: 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
c2e0: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
c2f0: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
c300: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
c310: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
c320: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
c330: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
c340: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
c350: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
c360: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
c370: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
c380: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
c390: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44  y *pFKey; .    D
c3a0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
c3b0: 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70  b[p->iDb];.    p
c3c0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
c3d0: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62  hInsert(&pDb->tb
c3e0: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
c3f0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
c400: 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  )+1, p);.    if(
c410: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
c420: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
c430: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
c440: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
c450: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
c460: 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  ) */.      retur
c470: 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  n;.    }.#ifndef
c480: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
c490: 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72  EIGN_KEY.    for
c4a0: 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b  (pFKey=p->pFKey;
c4b0: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46   pFKey; pFKey=pF
c4c0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  Key->pNextFrom){
c4d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
c4e0: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
c4f0: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
c500: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
c510: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
c520: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  &pDb->aFKey, pFK
c530: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
c540: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
c550: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b  Insert(&pDb->aFK
c560: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c570: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
c580: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
c590: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
c5a0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
c5b0: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
c5c0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
c5d0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
c5e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c5f0: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
c600: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
c610: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
c620: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
c630: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
c640: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
c650: 3e 7a 3d 3d 30 20 29 20 70 43 6f 6e 73 20 3d 20  >z==0 ) pCons = 
c660: 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  pEnd;.      p->a
c670: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
c680: 20 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20 2d 20 70   + (pCons->z - p
c690: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
c6a0: 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n.z);.    }.#end
c6b0: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
c6c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c6d0: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
c6e0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
c6f0: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
c700: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
c710: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
c720: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
c730: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c740: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
c750: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c760: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
c770: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
c780: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
c790: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
c7a0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
c7b0: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
c7c0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
c7d0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c7e0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
c7f0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
c800: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
c810: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
c820: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
c830: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
c840: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
c850: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
c860: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
c870: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
c880: 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20   isTemp         
c890: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
c8a0: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
c8b0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
c8c0: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
c8d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c8e0: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
c8f0: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
c900: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
c910: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
c920: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65  able(pParse, pBe
c930: 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  gin, pName1, pNa
c940: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b  me2, isTemp, 1);
c950: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
c960: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
c970: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
c980: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
c990: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c9a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c9b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
c9c0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
c9d0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
c9e0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
c9f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
ca00: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
ca10: 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65  se, p->iDb, "vie
ca20: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
ca30: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
ca40: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
ca50: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
ca60: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
ca70: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
ca80: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
ca90: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
caa0: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
cab0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
cac0: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
cad0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
cae0: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
caf0: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
cb00: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
cb10: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
cb20: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
cb30: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
cb40: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
cb50: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
cb60: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
cb70: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
cb80: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
cb90: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
cba0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
cbb0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
cbc0: 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29  lectDup(pSelect)
cbd0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
cbe0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
cbf0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
cc00: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  >db->init.busy )
cc10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
cc20: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
cc30: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
cc40: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
cc50: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
cc60: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
cc70: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
cc80: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
cc90: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
cca0: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
ccb0: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
ccc0: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
ccd0: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
cce0: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
ccf0: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
cd00: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e  n = 0;.  n = sEn
cd10: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b  d.z - pBegin->z;
cd20: 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e  .  z = (const un
cd30: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65  signed char*)pBe
cd40: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
cd50: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
cd60: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
cd70: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
cd80: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
cd90: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
cda0: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
cdb0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
cdc0: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
cdd0: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
cde0: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
cdf0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
ce00: 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e  (pParse, 0, &sEn
ce10: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
ce20: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ce30: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
ce40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ce50: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
ce60: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
ce70: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
ce80: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
ce90: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
cea0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
ceb0: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
cec0: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
ced0: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
cee0: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
cef0: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
cf00: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
cf10: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
cf20: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
cf30: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
cf40: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
cf50: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
cf60: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
cf70: 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
cf80: 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
cf90: 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
cfa0: 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
cfb0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cfc0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
cfd0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
cfe0: 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
cff0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
d000: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
d010: 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
d020: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
d030: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
d040: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
d050: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
d060: 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
d070: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
d080: 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  igned */..  asse
d090: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20  rt( pTable );.. 
d0a0: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
d0b0: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
d0c0: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
d0d0: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
d0e0: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
d0f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
d100: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
d110: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
d120: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
d130: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
d140: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
d150: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
d160: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
d170: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
d180: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
d190: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
d1a0: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
d1b0: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
d1c0: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
d1d0: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
d1e0: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
d1f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
d200: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
d210: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
d220: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
d230: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
d240: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
d250: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
d260: 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72  tually, this err
d270: 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65  or is caught pre
d280: 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74  viously and so t
d290: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
d2a0: 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c  t.  ** should al
d2b0: 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20  ways fail.  But 
d2c0: 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74  we will leave it
d2d0: 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74   in place just t
d2e0: 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a  o be safe..  */.
d2f0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
d300: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
d310: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d320: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
d330: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
d340: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
d350: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
d360: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
d370: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
d380: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
d390: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
d3a0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
d3b0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
d3c0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
d3d0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
d3e0: 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
d3f0: 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
d400: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
d410: 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
d420: 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
d430: 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
d440: 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
d450: 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
d460: 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
d470: 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
d480: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
d490: 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
d4a0: 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
d4b0: 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
d4c0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
d4d0: 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
d4e0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d4f0: 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
d500: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
d510: 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
d520: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d530: 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  Dup(pTable->pSel
d540: 65 63 74 29 3b 0a 20 20 6e 20 3d 20 70 50 61 72  ect);.  n = pPar
d550: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73 71 6c 69  se->nTab;.  sqli
d560: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
d570: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
d580: 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 70  pSel->pSrc);.  p
d590: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
d5a0: 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71  ;.  pSelTab = sq
d5b0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
d5c0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
d5d0: 2c 20 70 53 65 6c 29 3b 0a 20 20 70 50 61 72 73  , pSel);.  pPars
d5e0: 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 69  e->nTab = n;.  i
d5f0: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
d600: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d610: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
d620: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
d630: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
d640: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
d650: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
d660: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
d670: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
d680: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
d690: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
d6a0: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
d6b0: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
d6c0: 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  erty(pParse->db,
d6d0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42   pTable->iDb, DB
d6e0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
d6f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
d700: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
d710: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
d720: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d730: 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 72 65  lete(pSel);.  re
d740: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
d750: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d760: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
d770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d780: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
d790: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
d7a0: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
d7b0: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
d7c0: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
d7d0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
d7e0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
d7f0: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
d800: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
d810: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
d820: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
d830: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
d840: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
d850: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
d860: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
d870: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
d880: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
d890: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
d8a0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
d8b0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
d8c0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
d8d0: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
d8e0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
d8f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
d900: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
d910: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
d920: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
d930: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
d940: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
d950: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d960: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
d970: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d980: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
d990: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
d9a0: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
d9b0: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
d9c0: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
d9d0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
d9e0: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
d9f0: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
da00: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
da10: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
da20: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
da30: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
da40: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
da50: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
da60: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
da70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
da80: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
da90: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
daa0: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
dab0: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20  lem *pElem;.  . 
dac0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
dad0: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
dae0: 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d  >tblHash); pElem
daf0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
db00: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
db10: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
db20: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
db30: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
db40: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
db50: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
db60: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
db70: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
db80: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  }.  }.  for(pEle
db90: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
dba0: 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  t(&pDb->idxHash)
dbb0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
dbc0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
dbd0: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
dbe0: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
dbf0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
dc00: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
dc10: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
dc20: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
dc30: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
dc40: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  n;.    }.  }.  a
dc50: 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64  ssert(0);.}.#end
dc60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
dc70: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
dc80: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
dc90: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
dca0: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
dcb0: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
dcc0: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
dcd0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
dce0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
dcf0: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
dd00: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
dd10: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
dd20: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
dd30: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
dd40: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
dd50: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
dd60: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
dd70: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
dd80: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
dd90: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
dda0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
ddb0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
ddc0: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
ddd0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
dde0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  e(pParse);.  sql
ddf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
de00: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
de10: 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64  ble, iDb);.#ifnd
de20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
de30: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
de40: 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73  P_Destroy pushes
de50: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f   an integer onto
de60: 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74   the stack. If t
de70: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
de80: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
de90: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
dea0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
deb0: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
dec0: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
ded0: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
dee0: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
def0: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
df00: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
df10: 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
df20: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
df30: 22 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20  "#0" in the SQL 
df40: 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
df50: 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
df60: 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
df70: 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74    ** is on the t
df80: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
df90: 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67    See sqlite3Reg
dfa0: 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a  isterExpr()..  *
dfb0: 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
dfc0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
dfd0: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
dfe0: 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
dff0: 25 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20  %d WHERE #0 AND 
e000: 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20  rootpage=#0",.  
e010: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
e020: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
e030: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
e040: 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  , iTable);.#endi
e050: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  f.}../*.** Write
e060: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
e070: 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
e080: 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
e090: 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
e0a0: 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
e0b0: 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
e0c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
e0d0: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
e0e0: 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
e0f0: 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
e100: 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
e110: 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
e120: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
e130: 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
e140: 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
e150: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
e160: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
e170: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
e180: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
e190: 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
e1a0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e1b0: 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Tab){.#ifdef SQL
e1c0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e1d0: 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  UUM.  Index *pId
e1e0: 78 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  x;.  destroyRoot
e1f0: 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
e200: 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  b->tnum, pTab->i
e210: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
e220: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
e230: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
e240: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
e250: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
e260: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  e, pIdx->tnum, p
e270: 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23  Idx->iDb);.  }.#
e280: 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
e290: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
e2a0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
e2b0: 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
e2c0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e2d0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
e2e0: 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
e2f0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
e300: 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
e310: 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
e320: 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
e330: 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
e340: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
e350: 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
e360: 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
e370: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
e380: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
e390: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
e3a0: 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
e3b0: 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
e3c0: 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
e3d0: 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
e3e0: 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
e3f0: 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
e400: 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
e410: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
e420: 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
e430: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
e440: 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
e450: 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
e460: 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
e470: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
e480: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
e490: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
e4a0: 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
e4b0: 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
e4c0: 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
e4d0: 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
e4e0: 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
e4f0: 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
e500: 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
e510: 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
e520: 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
e530: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
e540: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
e550: 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
e560: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
e570: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
e580: 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
e590: 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
e5a0: 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
e5b0: 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
e5c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
e5d0: 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
e5e0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
e5f0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
e600: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
e610: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
e620: 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
e630: 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
e640: 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61  ( pIdx->iDb==pTa
e650: 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20  b->iDb );.      
e660: 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
e670: 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
e680: 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
e690: 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
e6a0: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
e6b0: 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
e6c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
e6d0: 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  gest==0 ) return
e6e0: 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
e6f0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
e700: 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44  argest, pTab->iD
e710: 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79  b);.    iDestroy
e720: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
e730: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
e740: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e750: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
e760: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
e770: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
e780: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
e790: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e7a0: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
e7b0: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
e7c0: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
e7d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
e7e0: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
e7f0: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
e800: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
e810: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
e820: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e830: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
e840: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
e850: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
e860: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
e870: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e880: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
e890: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
e8a0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
e8b0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
e8c0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
e8d0: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
e8e0: 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
e8f0: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
e900: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e910: 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  ;.  iDb = pTab->
e920: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
e930: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
e940: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
e950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
e960: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
e970: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
e980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
e990: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
e9a0: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
e9b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e9c0: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
e9d0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
e9e0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
e9f0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
ea00: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
ea10: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
ea20: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
ea30: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
ea40: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
ea50: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
ea60: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
ea70: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
ea80: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
ea90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
eaa0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
eab0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
eac0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ead0: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
eae0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
eaf0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
eb00: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
eb10: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
eb20: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
eb30: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
eb40: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
eb50: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
eb60: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
eb70: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
eb80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
eb90: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
eba0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
ebb0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
ebc0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
ebd0: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
ebe0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
ebf0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
ec00: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
ec10: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
ec20: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c  Tab->readOnly ||
ec30: 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69   pTab==db->aDb[i
ec40: 44 62 5d 2e 70 53 65 71 54 61 62 20 29 7b 0a 20  Db].pSeqTab ){. 
ec50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ec60: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
ec70: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
ec80: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
ec90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
eca0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
ecb0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
ecc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ecd0: 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
ece0: 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
ecf0: 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
ed00: 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
ed10: 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
ed20: 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
ed30: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
ed40: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
ed50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ed60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
ed70: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
ed80: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
ed90: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
eda0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
edb0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
edc0: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
edd0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
ede0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
edf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
ee00: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
ee10: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
ee20: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ee30: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
ee40: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
ee50: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
ee60: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
ee70: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
ee80: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
ee90: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
eea0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
eeb0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
eec0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
eed0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
eee0: 65 72 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20  er;.    int iDb 
eef0: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
ef00: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
ef10: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
ef20: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
ef30: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
ef40: 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   0, iDb);..    /
ef50: 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
ef60: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
ef70: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
ef80: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
ef90: 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65  e.    ** is gene
efa0: 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
efb0: 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
efc0: 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
efd0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f  r.    ** sqlite_
efe0: 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
eff0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f000: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
f010: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
f020: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
f030: 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
f040: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44  rt( pTrigger->iD
f050: 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69 67 67  b==iDb || pTrigg
f060: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
f070: 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
f080: 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
f090: 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a  , pTrigger, 1);.
f0a0: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
f0b0: 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
f0c0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
f0d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f0e0: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
f0f0: 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
f100: 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
f110: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
f120: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
f130: 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62  h.    ** the tab
f140: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
f150: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
f160: 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
f170: 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a  is dropped.    *
f180: 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
f190: 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
f1a0: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
f1b0: 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
f1c0: 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  .    ** move as 
f1d0: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
f1e0: 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
f1f0: 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
f200: 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  mode)..    */.  
f210: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f    if( pTab->auto
f220: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Inc ){.      sql
f230: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
f240: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f250: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
f260: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
f270: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
f280: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
f290: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
f2a0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
f2b0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
f2c0: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
f2d0: 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
f2e0: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
f2f0: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
f300: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
f310: 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
f320: 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
f330: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
f340: 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
f350: 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
f360: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
f370: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
f380: 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
f390: 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
f3a0: 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
f3b0: 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
f3c0: 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
f3d0: 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
f3e0: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
f3f0: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
f400: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
f410: 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
f420: 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
f430: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
f440: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
f450: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
f460: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
f470: 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
f480: 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
f490: 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
f4a0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
f4b0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
f4c0: 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
f4d0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
f4e0: 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72  w ){.      destr
f4f0: 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
f500: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pTab);.    }..  
f510: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
f520: 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
f530: 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
f540: 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
f550: 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  dify.    ** the 
f560: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
f570: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
f580: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44  3VdbeOp3(v, OP_D
f590: 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
f5a0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
f5b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
f5c0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
f5d0: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
f5e0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
f5f0: 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
f600: 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
f610: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
f620: 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
f630: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f640: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
f650: 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
f660: 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
f670: 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
f680: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
f690: 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
f6a0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
f6b0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
f6c0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
f6d0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
f6e0: 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
f6f0: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
f700: 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
f710: 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
f720: 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
f730: 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
f740: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
f750: 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
f760: 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
f770: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
f780: 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
f790: 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
f7a0: 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
f7b0: 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
f7c0: 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
f7d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
f7e0: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
f7f0: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
f800: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
f810: 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
f820: 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
f830: 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
f840: 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
f850: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
f860: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
f870: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
f880: 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
f890: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
f8a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f8b0: 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e  le field.  The n
f8c0: 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f  ew FKey.** is no
f8d0: 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62  t linked into db
f8e0: 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20  ->aFKey at this 
f8f0: 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65  point - that doe
f900: 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20  s not happen.** 
f910: 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64  until sqlite3End
f920: 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Table()..**.** T
f930: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
f940: 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
f950: 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
f960: 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
f970: 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
f980: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
f990: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
f9a0: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
f9b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f9c0: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
f9d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f9e0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
f9f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fa00: 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
fa10: 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
fa20: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
fa30: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
fa40: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
fa50: 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
fa60: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
fa70: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
fa80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
fa90: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
faa0: 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
fab0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
fac0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
fad0: 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
fae0: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
faf0: 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  s. */.){.#ifndef
fb00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
fb10: 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
fb20: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
fb30: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
fb40: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
fb50: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
fb60: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
fb70: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
fb80: 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
fb90: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
fba0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
fbb0: 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
fbc0: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
fbd0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
fbe0: 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  Col-1;.    if( i
fbf0: 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f  Col<0 ) goto fk_
fc00: 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
fc10: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
fc20: 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
fc30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fc40: 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
fc50: 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
fc60: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
fc70: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
fc80: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
fc90: 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
fca0: 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
fcb0: 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
fcc0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
fcd0: 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
fce0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
fcf0: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
fd00: 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
fd10: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
fd20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fd30: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
fd40: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
fd50: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
fd60: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
fd70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
fd80: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
fd90: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
fda0: 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
fdb0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
fdc0: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
fdd0: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
fde0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
fdf0: 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
fe00: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65  nCol*sizeof(pFKe
fe10: 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
fe20: 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
fe30: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
fe40: 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
fe50: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
fe60: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
fe70: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
fe80: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
fe90: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
fea0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
feb0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
fec0: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
fed0: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
fee0: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
fef0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
ff00: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
ff10: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
ff20: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
ff30: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
ff40: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
ff50: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
ff60: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
ff70: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
ff80: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
ff90: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
ffa0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
ffb0: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
ffc0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
ffd0: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
ffe0: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
fff0: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
10000 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
10010 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
10020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
10030 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
10040 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
10050 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
10060 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
10070 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
10080 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
10090 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
100a0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
100b0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
100c0 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
100d0 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
100e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
100f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10100 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
10110 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
10120 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10130 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
10140 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
10150 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
10160 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
10170 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
10180 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
10190 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
101a0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
101b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
101c0 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
101d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
101e0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
101f0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
10200 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
10210 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
10220 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
10230 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
10240 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
10250 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
10260 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
10270 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
10280 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
10290 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
102a0 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
102b0 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
102c0 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
102d0 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
102e0 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
102f0 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
10300 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
10310 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
10320 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
10330 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
10340 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
10350 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
10360 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
10370 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
10380 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
10390 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  ee(pFKey);.#endi
103a0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
103b0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
103c0 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
103d0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
103e0 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
103f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10400 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
10410 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10420 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
10430 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
10440 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
10450 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
10460 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
10470 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
10480 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
10490 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
104a0 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
104b0 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
104c0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
104d0 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
104e0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
104f0 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
10500 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
10510 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
10520 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
10530 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
10540 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
10550 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
10560 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
10570 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
10580 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10590 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
105a0 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
105b0 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
105c0 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
105d0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
105e0 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
105f0 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
10600 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
10610 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
10620 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e   isDeferred;.#en
10630 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
10640 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
10650 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
10660 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
10670 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
10680 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
10690 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
106a0 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
106b0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
106c0 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
106d0 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
106e0 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
106f0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
10700 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
10710 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
10720 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
10730 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
10740 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d  reated.  The mem
10750 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69  ory cell specifi
10760 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
10770 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
10780 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
10790 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
107a0 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
107b0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
107c0 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
107d0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
107e0 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
107f0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
10800 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
10810 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
10820 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
10830 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
10840 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
10850 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
10860 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
10870 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
10880 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
10890 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
108a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
108b0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
108c0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
108d0 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
108e0 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
108f0 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20  arse->nTab;     
10900 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
10910 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
10920 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
10930 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20  pParse->nTab+1; 
10940 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
10950 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
10960 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  dex */.  int add
10970 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
10980 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10990 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
109a0 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  p */.  int tnum;
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
109d0 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
109e0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10a10 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
10a20 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
10a30 69 6e 74 20 69 73 55 6e 69 71 75 65 3b 20 20 20  int isUnique;   
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10a50 2a 20 54 72 75 65 20 66 6f 72 20 61 20 75 6e 69  * True for a uni
10a60 71 75 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 23 69  que index */..#i
10a70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10a80 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
10a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
10aa0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
10ab0 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
10ac0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
10ad0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
10ae0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
10af0 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
10b00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
10b10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75  endif..  /* Ensu
10b20 72 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  re all the requi
10b30 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  red collation se
10b40 71 75 65 6e 63 65 73 20 61 72 65 20 61 76 61 69  quences are avai
10b50 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a  lable. This.  **
10b60 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
10b70 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  voke the collati
10b80 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on-needed callba
10b90 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
10ba0 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  (and.  ** if one
10bb0 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73 74   has been regist
10bc0 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  ered)..  */.  if
10bd0 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e  ( sqlite3CheckIn
10be0 64 65 78 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  dexCollSeq(pPars
10bf0 65 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  e, pIndex) ){.  
10c00 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10c10 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10c20 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10c30 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10c40 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
10c50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  age>=0 ){.    sq
10c60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10c70 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65  , OP_MemLoad, me
10c80 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20  mRootPage, 0);. 
10c90 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d     tnum = 0;.  }
10ca0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
10cb0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
10cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10cd0 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  dOp(v, OP_Clear,
10ce0 20 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69   tnum, pIndex->i
10cf0 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
10d00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10d10 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65  P_Integer, pInde
10d20 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71  x->iDb, 0);.  sq
10d30 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10d40 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
10d50 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20  dx, tnum,.      
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
10d70 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  har*)&pIndex->ke
10d80 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
10d90 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
10da0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10db0 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c  eger, pTab->iDb,
10dc0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
10dd0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
10de0 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 54  enRead, iTab, pT
10df0 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c  ab->tnum);.  sql
10e00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10e10 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
10e20 73 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e  s, iTab, pTab->n
10e30 43 6f 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  Col);.  addr1 = 
10e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e50 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
10e60 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
10e70 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
10e80 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54  ey(v, pIndex, iT
10e90 61 62 29 3b 0a 20 20 69 73 55 6e 69 71 75 65 20  ab);.  isUnique 
10ea0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
10eb0 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71  r!=OE_None;.  sq
10ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10ed0 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 69 49 64  , OP_IdxPut, iId
10ee0 78 2c 20 69 73 55 6e 69 71 75 65 29 3b 0a 20 20  x, isUnique);.  
10ef0 69 66 28 20 69 73 55 6e 69 71 75 65 20 29 7b 0a  if( isUnique ){.
10f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10f10 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
10f20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
10f30 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
10f40 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P3_STATIC);.  }
10f50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10f60 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
10f70 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a  iTab, addr1+1);.
10f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10f90 6e 67 65 50 32 28 76 2c 20 61 64 64 72 31 2c 20  ngeP2(v, addr1, 
10fa0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10fb0 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 73 71  ntAddr(v));.  sq
10fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10fd0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
10fe0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
10ff0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
11000 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a  lose, iIdx, 0);.
11010 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
11020 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
11030 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
11040 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
11050 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11060 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
11070 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
11080 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
11090 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
110a0 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
110b0 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
110c0 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
110d0 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
110e0 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
110f0 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
11100 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
11110 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
11120 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
11130 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
11140 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
11150 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
11160 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
11170 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
11180 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
11190 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
111a0 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
111b0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
111c0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
111d0 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
111e0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
111f0 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
11200 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
11210 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
11220 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
11230 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
11240 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
11250 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
11260 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
11270 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
11280 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
11290 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
112a0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
112b0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
112c0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
112d0 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
112e0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
112f0 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
11300 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
11310 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
11320 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
11330 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
11340 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
11350 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
11360 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
11370 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
11380 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
11390 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
113a0 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
113b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
113c0 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
113d0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
113e0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
113f0 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
11400 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
11410 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
11420 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
11430 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
11440 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
11450 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
11460 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
11470 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
11480 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
11490 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
114a0 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
114b0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
114c0 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
114d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
114e0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
114f0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
11500 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
11510 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
11520 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
11530 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
11540 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
11550 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
11560 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
11570 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
11580 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
11590 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20  sFix;    /* For 
115a0 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
115b0 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
115c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  le */.  int isTe
115d0 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp;      /* True
115e0 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
115f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69   index */.  sqli
11600 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11610 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62  ->db;..  int iDb
11620 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
11630 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
11640 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
11650 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
11660 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
11670 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
11680 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
11690 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  x to create */..
116a0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
116b0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
116c0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
116d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
116e0 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ndex;..  /*.  **
116f0 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
11700 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
11710 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
11720 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
11730 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
11740 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
11750 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
11760 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
11770 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
11780 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
11790 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
117a0 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
117b0 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
117c0 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
117d0 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
117e0 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
117f0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11800 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
11810 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
11820 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
11830 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
11840 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
11850 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
11860 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
11870 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
11880 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
11890 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
118a0 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
118b0 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
118c0 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
118d0 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
118e0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
118f0 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  o 1..    */.    
11900 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
11910 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
11920 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
11930 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
11940 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
11950 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69   pTab && pTab->i
11960 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  Db==1 ){.      i
11970 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  Db = 1;.    }.. 
11980 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
11990 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
119a0 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
119b0 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20  ", pName) &&.   
119c0 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53       sqlite3FixS
119d0 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
119e0 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20  blName).    ){. 
119f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11a00 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11a10 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
11a20 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
11a30 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
11a40 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a  e->a[0].zName, .
11a50 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65          pTblName
11a60 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
11a70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
11a80 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11a90 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
11aa0 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62  ssert( iDb==pTab
11ab0 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65  ->iDb );.  }else
11ac0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
11ad0 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
11ae0 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
11af0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62  ewTable;.    iDb
11b00 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
11b10 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  }..  if( pTab==0
11b20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
11b30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11b40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
11b50 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
11b60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11b70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11b80 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
11b90 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
11ba0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
11bb0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11bc0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
11bd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11be0 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
11bf0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
11c00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11c10 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
11c20 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
11c30 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
11c40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11c50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 73  .  }.#endif.  is
11c60 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62  Temp = pTab->iDb
11c70 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ==1;..  /*.  ** 
11c80 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
11c90 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
11ca0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
11cb0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
11cc0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
11cd0 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
11ce0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
11cf0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
11d00 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
11d10 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
11d20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
11d30 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
11d40 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
11d50 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
11d60 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11d70 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
11d80 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
11d90 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
11da0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
11db0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
11dc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
11dd0 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
11de0 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
11df0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
11e00 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
11e10 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
11e20 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
11e30 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
11e40 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
11e50 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
11e60 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
11e70 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
11e80 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
11e90 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
11ea0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
11eb0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
11ec0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
11ed0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
11ee0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
11ef0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
11f00 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11f10 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
11f20 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
11f30 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11f40 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
11f50 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
11f60 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
11f70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
11f80 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11f90 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11fa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
11fb0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
11fc0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61       Index *pISa
11fd0 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
11fe0 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
11ff0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
12000 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
12010 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
12020 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
12030 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
12040 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
12050 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
12060 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
12070 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
12080 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12090 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61  .      if( (pISa
120a0 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
120b0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
120c0 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
120d0 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a  ].zName))!=0 ){.
120e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
120f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12100 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
12110 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
12120 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
12130 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12140 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
12150 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
12160 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
12170 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
12180 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
12190 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
121a0 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
121b0 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
121c0 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
121d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
121e0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
121f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
12200 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
12210 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
12220 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
12230 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
12240 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
12250 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
12260 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
12270 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
12280 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
12290 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a  ,"_%d",n);.    z
122a0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Name = 0;.    sq
122b0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
122c0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
122d0 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62  utoindex_", pTab
122e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28  ->zName, zBuf, (
122f0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66  char*)0);.    if
12300 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
12310 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12320 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  dex;.  }..  /* C
12330 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
12340 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
12350 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
12360 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12370 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12380 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
12390 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
123a0 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
123b0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
123c0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
123d0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
123e0 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
123f0 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
12400 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
12410 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12420 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
12430 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
12440 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
12450 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c  isTemp ) i = SQL
12460 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
12470 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
12480 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12490 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
124a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
124b0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
124c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
124d0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
124e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
124f0 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
12500 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
12510 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
12520 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
12530 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
12540 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
12550 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
12560 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
12570 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
12580 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
12590 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
125a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
125b0 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
125c0 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  d.z = pTab->aCol
125d0 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
125e0 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
125f0 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c  .n = strlen(null
12600 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
12610 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
12620 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26  stAppend(0, 0, &
12630 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
12640 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
12650 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12660 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20  ex;.  }..  /* . 
12670 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
12680 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
12690 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78  . .  */.  pIndex
126a0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
126b0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
126c0 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
126d0 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20   1 +.           
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
126f0 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
12700 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c  of(CollSeq*))*pL
12710 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
12720 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20  if( pIndex==0 ) 
12730 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12740 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78  _index;.  pIndex
12750 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
12760 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  t*)&pIndex->keyI
12770 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d  nfo.aColl[pList-
12780 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65  >nExpr];.  pInde
12790 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
127a0 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
127b0 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  umn[pList->nExpr
127c0 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  ];.  strcpy(pInd
127d0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
127e0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
127f0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
12800 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
12810 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
12820 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
12830 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  = onError;.  pIn
12840 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
12850 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e   pName==0;.  pIn
12860 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  dex->iDb = iDb;.
12870 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
12880 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
12890 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
128a0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
128b0 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
128c0 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
128d0 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
128e0 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
128f0 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
12900 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
12910 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
12920 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
12930 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12940 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
12950 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
12960 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
12970 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
12980 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
12990 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
129a0 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
129b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
129c0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
129d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
129e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
129f0 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f  ble %s has no co
12a00 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a  lumn named %s",.
12a10 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
12a20 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  ame, pList->a[i]
12a30 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  .zName);.      g
12a40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12a50 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
12a60 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
12a70 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66  n[i] = j;.    if
12a80 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ( pList->a[i].pE
12a90 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  xpr ){.      ass
12aa0 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  ert( pList->a[i]
12ab0 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  .pExpr->pColl );
12ac0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
12ad0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
12ae0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
12af0 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
12b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
12b10 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
12b20 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43  ll[i] = pTab->aC
12b30 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20  ol[j].pColl;.   
12b40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
12b50 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
12b60 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69  Coll[i] );.    i
12b70 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
12b80 79 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71  y && .        sq
12b90 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
12ba0 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  q(pParse, pIndex
12bb0 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12bc0 69 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  i]) .    ){.    
12bd0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12be0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
12bf0 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65    }.  pIndex->ke
12c00 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70  yInfo.nField = p
12c10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
12c20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
12c30 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
12c40 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
12c50 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
12c60 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
12c70 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
12c80 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
12c90 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
12ca0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
12cb0 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
12cc0 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
12cd0 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
12ce0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
12cf0 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
12d00 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
12d10 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
12d20 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
12d30 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
12d40 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
12d50 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
12d60 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
12d70 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
12d80 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
12d90 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
12da0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
12db0 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
12dc0 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
12dd0 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
12de0 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
12df0 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
12e00 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
12e10 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
12e20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
12e30 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
12e40 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
12e50 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
12e60 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
12e70 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
12e80 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
12e90 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
12ea0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
12eb0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
12ec0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
12ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12ee0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
12ef0 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  None );.      as
12f00 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f  sert( pIdx->auto
12f10 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61  Index );.      a
12f20 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f  ssert( pIndex->o
12f30 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
12f40 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
12f50 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e  dx->nColumn!=pIn
12f60 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  dex->nColumn ) c
12f70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
12f80 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
12f90 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20  nColumn; k++){. 
12fa0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12fb0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
12fc0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
12fd0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
12fe0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79     if( pIdx->key
12ff0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70  Info.aColl[k]!=p
13000 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
13010 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  Coll[k] ) break;
13020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13030 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( k==pIdx->nCol
13040 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  umn ){.        i
13050 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
13060 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
13070 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
13080 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
13090 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
130a0 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
130b0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
130c0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
130d0 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
130e0 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
130f0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
13100 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
13110 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
13120 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
13130 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
13140 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
13150 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
13160 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
13170 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
13180 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
13190 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
131a0 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
131b0 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
131c0 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
131d0 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
131e0 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
131f0 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
13200 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74   behaviour for t
13210 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
13220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
13230 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
13240 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
13250 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
13260 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
13270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13280 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13290 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
132a0 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
132b0 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
132c0 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
132d0 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
132e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
132f0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
13300 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
13310 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
13320 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
13330 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
13340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13350 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
13360 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13370 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
13380 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
13390 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
133a0 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
133b0 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
133c0 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
133d0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
133e0 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
133f0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
13400 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
13410 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
13420 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
13430 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d  &db->aDb[pIndex-
13440 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a  >iDb].idxHash, .
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
13470 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
13480 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  Index->zName)+1,
13490 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
134a0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
134b0 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
134c0 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
134d0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
134e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
134f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13500 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
13510 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
13520 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
13530 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
13540 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
13550 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
13560 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
13570 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
13580 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
13590 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
135a0 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
135b0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
135c0 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
135d0 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
135e0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
135f0 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
13600 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
13610 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
13620 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
13630 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
13640 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
13650 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
13660 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
13670 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
13680 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
13690 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
136a0 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
136b0 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
136c0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
136d0 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
136e0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
136f0 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
13700 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
13710 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
13720 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
13730 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
13740 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
13750 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
13760 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
13770 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
13780 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
13790 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
137a0 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
137b0 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
137c0 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
137d0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
137e0 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
137f0 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
13800 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
13810 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
13820 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
13830 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
13840 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
13850 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
13860 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64   */.  else if( d
13870 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
13880 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
13890 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
138a0 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
138b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
138c0 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
138d0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
138e0 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
138f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13900 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20  _index;..    /* 
13910 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
13920 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
13930 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
13940 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
13950 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
13960 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
13970 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13980 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
13990 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71   iDb, 0);.    sq
139a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
139b0 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
139c0 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Mem, 0);..    /*
139d0 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
139e0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
139f0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
13a00 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
13a10 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
13a20 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
13a30 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
13a40 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pEnd ){.      /*
13a50 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
13a60 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
13a70 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13a80 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
13a90 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
13aa0 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73  Printf("CREATE%s
13ab0 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
13ac0 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
13ad0 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
13ae0 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20  UNIQUE",.       
13af0 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
13b00 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20   Addr(pName->z) 
13b10 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61  + 1,.        pNa
13b20 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
13b30 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
13b40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
13b50 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
13b60 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
13b70 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
13b80 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
13b90 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13ba0 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
13bb0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
13bc0 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
13bd0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
13be0 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
13bf0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
13c00 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13c10 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
13c20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
13c30 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
13c40 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51  dex',%Q,%Q,#0,%Q
13c50 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
13c60 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
13c70 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
13c80 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
13c90 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
13ca0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
13cb0 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
13cc0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
13cd0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13ce0 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
13cf0 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74  sqliteFree(zStmt
13d00 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
13d10 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
13d20 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
13d30 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
13d40 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
13d50 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
13d60 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
13d70 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
13d80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13d90 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
13da0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
13db0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
13dc0 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
13dd0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
13de0 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
13df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13e00 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
13e10 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
13e20 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
13e30 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d  e3MPrintf("name=
13e40 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  '%q'", pIndex->z
13e50 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49  Name), P3_DYNAMI
13e60 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
13e70 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13e80 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a  _Expire, 0, 0);.
13e90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13ea0 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
13eb0 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
13ec0 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
13ed0 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
13ee0 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
13ef0 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
13f00 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
13f10 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
13f20 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
13f30 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
13f40 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
13f50 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
13f60 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
13f70 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
13f80 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
13f90 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
13fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
13fb0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
13fc0 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
13fd0 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
13fe0 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
13ff0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
14000 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
14010 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
14020 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
14030 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
14040 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
14050 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
14060 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
14070 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
14080 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
14090 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
140a0 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
140b0 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
140c0 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
140d0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
140e0 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
140f0 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
14100 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
14110 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
14120 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
14130 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
14140 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
14150 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
14160 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14170 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
14180 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78  ){.    freeIndex
14190 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20  (pIndex);.  }.  
141a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
141b0 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
141c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
141d0 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a  lete(pTblName);.
141e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
141f0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
14200 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14210 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
14220 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
14230 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
14240 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
14250 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
14260 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
14270 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
14280 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
14290 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
142a0 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
142b0 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
142c0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
142d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
142e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
142f0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
14300 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
14310 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14320 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
14330 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
14340 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
14350 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
14360 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
14370 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
14380 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
14390 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
143a0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
143b0 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
143c0 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
143d0 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
143e0 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
143f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14400 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14410 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
14420 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
14430 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
14440 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
14450 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14460 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
14470 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
14480 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
14490 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
144a0 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
144b0 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
144c0 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
144d0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
144e0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
144f0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
14500 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
14510 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
14520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
14530 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
14540 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
14550 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
14560 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
14570 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
14580 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14590 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
145a0 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61  pIndex->iDb].zNa
145b0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
145c0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
145d0 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e  A_TABLE(pIndex->
145e0 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
145f0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14600 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14610 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
14620 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14630 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
14640 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
14650 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63   pIndex->iDb ) c
14660 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
14670 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
14680 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14690 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
146a0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
146b0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
146c0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
146d0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
146e0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
146f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
14700 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
14710 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
14720 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
14730 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
14740 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14750 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14760 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20   ){.    int iDb 
14770 3d 20 70 49 6e 64 65 78 2d 3e 69 44 62 3b 0a 20  = pIndex->iDb;. 
14780 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
14790 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
147a0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
147b0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
147c0 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64  me=%Q",.       d
147d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
147e0 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
147f0 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e  iDb),.       pIn
14800 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
14810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
14820 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
14830 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
14840 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
14850 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
14860 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
14870 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
14880 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
14890 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
148a0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
148b0 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
148c0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
148d0 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
148e0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
148f0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
14900 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
14910 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
14920 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
14930 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
14940 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
14950 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
14960 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
14970 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
14980 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
14990 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
149a0 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
149b0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
149c0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
149d0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
149e0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
149f0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
14a00 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
14a10 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
14a20 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49  .  if( pList->nI
14a30 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  d>=pList->nAlloc
14a40 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49   ){.    struct I
14a50 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  dList_item *a;. 
14a60 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
14a70 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
14a80 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20  *2 + 5;.    a = 
14a90 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
14aa0 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
14ab0 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69  Alloc*sizeof(pLi
14ac0 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
14ad0 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
14ae0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
14af0 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
14b00 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
14b10 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
14b20 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
14b30 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
14b40 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
14b50 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
14b60 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70  ));.  pList->a[p
14b70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
14b80 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
14b90 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
14ba0 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
14bb0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
14bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
14bd0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
14be0 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
14bf0 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
14c00 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
14c10 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
14c20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
14c30 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
14c40 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
14c50 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
14c60 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
14c70 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
14c80 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
14c90 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
14ca0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
14cb0 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
14cc0 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
14cd0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
14ce0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
14cf0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
14d00 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
14d10 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
14d20 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
14d30 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
14d40 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
14d50 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
14d60 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
14d70 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
14d80 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
14d90 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
14da0 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
14db0 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
14dc0 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
14dd0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
14de0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
14df0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
14e00 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
14e10 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
14e20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
14e30 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
14e40 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
14e50 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
14e60 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
14e70 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
14e80 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
14e90 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
14ea0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14eb0 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
14ec0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
14ed0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
14ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
14ef0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
14f00 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
14f10 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
14f20 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
14f30 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
14f40 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
14f50 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
14f60 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
14f70 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
14f80 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
14f90 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
14fa0 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
14fb0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
14fc0 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
14fd0 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
14fe0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14ff0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
15000 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
15010 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
15020 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
15030 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
15040 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15050 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
15060 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
15070 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
15080 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
15090 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
150a0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
150b0 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
150c0 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
150d0 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
150e0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
150f0 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
15100 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
15110 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
15120 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
15130 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
15140 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
15150 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
15160 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
15170 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
15180 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
15190 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
151a0 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
151b0 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
151c0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
151d0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
151e0 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
151f0 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
15200 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
15210 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
15220 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
15230 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
15240 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
15250 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
15260 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
15270 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
15280 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
15290 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
152a0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
152b0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
152c0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
152d0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
152e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
152f0 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
15300 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
15310 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
15320 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
15330 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
15340 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
15350 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
15360 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
15370 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
15380 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
15390 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
153a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
153b0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74  ;.  for(i=0, pIt
153c0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
153d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
153e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
153f0 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
15400 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
15410 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
15420 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15430 2b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  +;.    if( pItem
15440 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
15450 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
15460 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
15470 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
15480 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
15490 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
154a0 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
154b0 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
154c0 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
154d0 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
154e0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
154f0 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
15500 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
15510 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
15520 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
15530 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
15540 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70  {.    pList->a[p
15550 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41  List->nSrc-1].zA
15560 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
15570 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
15580 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
15590 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
155a0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
155b0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
155c0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
155d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
155e0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
155f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
15600 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
15610 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
15620 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
15630 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
15640 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
15650 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
15660 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
15670 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
15680 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
15690 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
156a0 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
156b0 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
156c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
156d0 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
156e0 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
156f0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
15700 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
15710 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
15720 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
15730 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
15740 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
15750 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
15760 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
15770 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
15780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
15790 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  1;.}../*.** Dele
157a0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
157b0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
157c0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
157d0 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
157e0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
157f0 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
15800 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
15810 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
15820 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
15830 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
15840 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
15850 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
15860 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
15870 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
15880 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
15890 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
158a0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
158b0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
158c0 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
158d0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
158e0 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 26  f( pItem->pTab &
158f0 26 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69  & pItem->pTab->i
15900 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
15910 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
15920 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d  eTable(0, pItem-
15930 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >pTab);.    }.  
15940 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
15950 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65  elete(pItem->pSe
15960 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
15970 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
15980 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
15990 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
159a0 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  e(pItem->pUsing)
159b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
159c0 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
159d0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
159e0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
159f0 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
15a00 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
15a10 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
15a20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15a30 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
15a40 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  t i;..  if( pPar
15a50 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
15a60 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
15a70 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
15a80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
15a90 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
15aa0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
15ab0 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
15ac0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
15ad0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15ae0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
15af0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
15b00 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
15b10 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15b20 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15b30 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
15b40 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
15b50 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
15b60 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
15b70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
15b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15b90 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
15ba0 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
15bb0 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
15bc0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
15bd0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15be0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
15bf0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
15c00 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
15c10 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
15c20 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
15c30 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
15c40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15c50 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
15c60 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
15c70 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
15c80 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
15c90 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
15ca0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
15cb0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
15cc0 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
15cd0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
15ce0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15cf0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
15d00 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
15d10 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65  MIT", 0, 0) ) re
15d20 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
15d30 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15d40 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
15d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15d60 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
15d70 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
15d80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
15d90 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
15da0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
15db0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
15dc0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
15dd0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
15de0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
15df0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
15e00 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
15e10 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
15e20 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
15e30 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
15e40 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
15e50 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
15e60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
15e70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
15e80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
15e90 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
15ea0 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
15eb0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
15ec0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15ed0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
15ee0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15ef0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
15f00 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
15f10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
15f20 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
15f30 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
15f40 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
15f50 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
15f60 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
15f70 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
15f80 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
15f90 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
15fa0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
15fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
15fc0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
15fd0 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
15fe0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
15ff0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16000 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
16010 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
16020 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
16030 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
16040 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
16050 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41  db, 0, 0, MAX_PA
16060 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d  GES, &db->aDb[1]
16070 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72  .pBt);.    if( r
16080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16090 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
160a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
160b0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
160c0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
160d0 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
160e0 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
160f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
16100 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
16110 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
16120 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
16130 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
16140 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  s & !db->autoCom
16150 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  mit ){.      rc 
16160 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
16170 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62  ginTrans(db->aDb
16180 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20  [1].pBt, 1);.   
16190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
161a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
161b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
161c0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
161d0 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c  to get a write l
161e0 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20  ock on ".       
161f0 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72     "the temporar
16200 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  y database file"
16210 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
16220 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
16230 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16250 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16260 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
16270 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
16280 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
16290 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73  ema cookie and s
162a0 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74  tart.** a read-t
162b0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61  ransaction for a
162c0 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ll named databas
162d0 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  e files..**.** I
162e0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
162f0 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63  hat all schema c
16300 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69  ookies be verifi
16310 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65  ed and all.** re
16320 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ad transactions 
16330 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
16340 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  e anything else 
16350 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68  happens in.** th
16360 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
16370 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
16380 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
16390 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72  after much other
163a0 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65  .** code has bee
163b0 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f  n generated.  So
163c0 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65   here is what we
163d0 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   do:.**.** The f
163e0 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
163f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16400 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f  , we code an OP_
16410 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c  Goto that.** wil
16420 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72  l jump to a subr
16430 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e  outine at the en
16440 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d of the program
16450 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65  .  Then we.** re
16460 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62  cord every datab
16470 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69  ase that needs i
16480 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69  ts schema verifi
16490 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61  ed in the.** pPa
164a0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
164b0 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61  field.  Later, a
164c0 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63  fter all other c
164d0 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
164e0 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73  generated, the s
164f0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ubroutine that d
16500 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  oes the cookie v
16510 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64  erifications and
16520 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74  .** starts the t
16530 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c  ransactions will
16540 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68   be coded and th
16550 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c  e OP_Goto P2 val
16560 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
16570 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
16580 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
16590 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
165a0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
165b0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
165c0 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
165d0 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
165e0 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
165f0 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74  **.** If iDb<0 t
16600 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f  hen code the OP_
16610 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27  Goto only - don'
16620 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65  t set flag to ve
16630 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65  rify the.** sche
16640 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61  ma on any databa
16650 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62  ses.  This can b
16660 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
16670 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a  on the OP_Goto.*
16680 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63  * early in the c
16690 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b  ode, before we k
166a0 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62  now if any datab
166b0 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20  ase tables will 
166c0 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  be used..*/.void
166d0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
166e0 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
166f0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
16700 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16710 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
16720 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
16730 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16740 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
16750 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
16760 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
16770 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
16780 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
16790 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
167a0 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
167b0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
167c0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
167d0 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
167e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
167f0 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b  P_Goto, 0, 0)+1;
16800 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d  .  }.  if( iDb>=
16810 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
16820 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
16830 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16840 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
16850 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  || iDb==1 );.   
16860 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32 20   assert( iDb<32 
16870 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c  );.    mask = 1<
16880 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70  <iDb;.    if( (p
16890 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
168a0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
168b0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
168c0 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
168d0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
168e0 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
168f0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
16900 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
16910 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
16920 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16930 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
16940 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  se(pParse);.    
16950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
16960 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16970 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
16980 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
16990 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
169a0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
169b0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
169c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
169d0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
169e0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
169f0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
16a00 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
16a10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
16a20 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
16a30 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
16a40 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
16a50 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
16a60 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
16a70 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
16a80 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
16a90 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
16aa0 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
16ab0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
16ac0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
16ad0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
16ae0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
16af0 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
16b00 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
16b10 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
16b20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16b30 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
16b40 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
16b50 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
16b60 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
16b70 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
16b80 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
16b90 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
16ba0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
16bb0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
16bc0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
16bd0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
16be0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
16bf0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
16c00 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f   be set..**.** O
16c10 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62  nly database iDb
16c20 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
16c30 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
16c40 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73  writable by this
16c50 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62   call..** If iDb
16c60 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ==0, then the ma
16c70 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61  in and temp data
16c80 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77  bases are made w
16c90 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a  ritable.   If.**
16ca0 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c   iDb==1 then onl
16cb0 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  y the temp datab
16cc0 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  ase is made writ
16cd0 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20  able.  If iDb>1 
16ce0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63  then the.** spec
16cf0 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20  ified auxiliary 
16d00 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
16d10 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
16d20 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
16d30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16d40 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
16d50 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
16d60 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
16d70 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
16d80 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
16d90 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16da0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
16db0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
16dc0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
16dd0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
16de0 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65  .  pParse->write
16df0 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a  Mask |= 1<<iDb;.
16e00 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65    if( setStateme
16e10 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  nt && pParse->ne
16e20 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
16e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16e40 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c  v, OP_Statement,
16e50 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20   iDb, 0);.  }.  
16e60 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 70 50  if( iDb!=1 && pP
16e70 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
16e80 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73  .pBt!=0 ){.    s
16e90 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16ea0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
16eb0 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  , setStatement, 
16ec0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  1);.  }.}..#ifnd
16ed0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
16ee0 54 46 31 36 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  TF16./* .** Retu
16ef0 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  rn the transient
16f00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
16f10 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65  bject used for e
16f20 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69  ncoding conversi
16f30 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51  ons.** during SQ
16f40 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a  L compilation..*
16f50 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
16f60 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73  *sqlite3GetTrans
16f70 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65  ientValue(sqlite
16f80 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64  3 *db){.  if( !d
16f90 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20  b->pValue ){.   
16fa0 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71   db->pValue = sq
16fb0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
16fc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
16fd0 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 23 65 6e 64  ->pValue;.}.#end
16fe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
16ff0 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
17000 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
17010 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
17020 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
17030 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
17040 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
17050 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
17060 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17070 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
17080 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
17090 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  h(CollSeq *pColl
170a0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
170b0 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64  {.  int n = pInd
170c0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65  ex->keyInfo.nFie
170d0 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  ld;.  CollSeq **
170e0 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79  pp = pIndex->key
170f0 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68  Info.aColl;.  wh
17100 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20  ile( n-- ){.    
17110 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29  if( *pp==pColl )
17120 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 70   return 1;.    p
17130 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p++;.  }.  retur
17140 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
17150 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
17160 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
17170 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
17180 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17190 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
171a0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
171b0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
171c0 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
171d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
171e0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
171f0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
17200 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
17210 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c 53 65  le *pTab, CollSe
17220 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  q *pColl){.  Ind
17230 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
17240 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
17250 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
17260 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
17270 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
17280 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
17290 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
172a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
172b0 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  pColl==0 || coll
172c0 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f 6c 6c  ationMatch(pColl
172d0 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  ,pIndex) ){.    
172e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
172f0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
17300 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44  rse, 0, pTab->iD
17310 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
17320 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
17330 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
17340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
17350 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
17360 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
17370 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
17380 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
17390 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
173a0 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
173b0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
173c0 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
173d0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
173e0 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
173f0 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
17400 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17410 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
17420 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
17430 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
17440 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  e, CollSeq *pCol
17450 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
17480 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
17490 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
174a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
174b0 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
174c0 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
174d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
174e0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
174f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17500 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
17510 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
17520 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
17530 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
17540 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
17550 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
17560 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
17570 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
17580 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c  */..  for(iDb=0,
17590 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
175a0 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
175b0 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66  , pDb++){.    if
175c0 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74 69  ( pDb==0 ) conti
175d0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
175e0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
175f0 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b  (&pDb->tblHash);
17600 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
17610 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
17620 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
17630 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
17640 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
17650 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
17660 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, pColl);.    
17670 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
17680 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17690 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
176a0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
176b0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
176c0 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
176e0 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
176f0 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
17710 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
17720 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
17730 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
17740 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
17750 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
17760 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
17770 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
17780 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
17790 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
177a0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
177b0 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
177c0 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
177d0 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
177e0 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
177f0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
17800 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
17810 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
17820 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
17830 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
17840 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
17850 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
17860 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
17870 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
17880 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
17890 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
178a0 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
178b0 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
178c0 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
178d0 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
178e0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
178f0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
17900 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
17910 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
17920 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
17950 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
17960 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
17970 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
17980 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
17990 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
179a0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
179b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
179c0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
179d0 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
179e0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
179f0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
17a00 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
17a10 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
17a20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
17a30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
17a40 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
17a50 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
17a60 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17a70 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
17a80 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17a90 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
17aa0 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
17ab0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
17ac0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
17ad0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
17ae0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
17af0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
17b00 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
17b10 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
17b20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
17b30 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
17b40 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
17b50 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
17b60 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
17b70 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
17b80 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
17b90 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
17ba0 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d  Name1==0 || pNam
17bb0 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e1->z==0 ){.    
17bc0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
17bd0 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
17be0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
17bf0 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c   if( pName2==0 |
17c00 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
17c10 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
17c20 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
17c30 28 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e  (db, db->enc, pN
17c40 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d  ame1->z, pName1-
17c50 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
17c60 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
17c70 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
17c80 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a  pParse, pColl);.
17c90 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
17ca0 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20    }.  }.  iDb = 
17cb0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
17cc0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
17cd0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
17ce0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
17cf0 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
17d00 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
17d10 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65  omToken(pObjName
17d20 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  );.  zDb = db->a
17d30 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
17d40 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
17d50 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
17d60 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
17d70 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
17d80 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
17d90 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
17da0 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65  eFree(z);.    re
17db0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
17dc0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
17dd0 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
17de0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
17df0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
17e00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
17e10 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
17e20 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
17e30 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
17e40 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
17e50 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
17e60 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
17e70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17e80 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
17e90 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
17ea0 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
17eb0 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
17ec0 6e 64 69 66 0a                                   ndif.