/ Hex Artifact Content
Login

Artifact 66bf13d2d478d43b9b490bebf07ea62524d80993:


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 33 20 32 30 30 35 2f 30 33 2f 31 36  1.313 2005/03/16
02f0: 20 31 32 3a 31 35 3a 32 31 20 64 61 6e 69 65 6c   12:15:21 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: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b140: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
b150: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
b160: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
b170: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b180: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
b190: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
b1a0: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
b1b0: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
b1c0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
b1d0: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
b1e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
b1f0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b200: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
b210: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
b220: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
b230: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
b240: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
b250: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
b260: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
b270: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
b280: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
b290: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
b2a0: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
b2b0: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
b2c0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
b2d0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
b2e0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
b2f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b300: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
b310: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
b320: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
b330: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
b340: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
b350: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
b360: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
b370: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
b380: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
b390: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
b3a0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
b3b0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
b3c0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
b3d0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
b3e0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
b3f0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b400: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
b410: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
b420: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
b430: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
b440: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b450: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
b460: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
b470: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
b480: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
b490: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
b4a0: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
b4b0: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
b4c0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
b4d0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
b4e0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
b4f0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
b500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
b510: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
b520: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
b530: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
b540: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
b550: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
b560: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
b570: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
b580: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
b590: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
b5a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
b5b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
b5c0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
b5d0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
b5e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b5f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
b600: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
b610: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
b620: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
b630: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  ose, 0, 0);..   
b640: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
b650: 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
b660: 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75  new table and pu
b670: 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73  sh it onto the s
b680: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76  tack..    ** A v
b690: 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70  iew has no rootp
b6a0: 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73  age, so just pus
b6b0: 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68  h a zero onto th
b6c0: 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20  e stack for.    
b6d0: 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69  ** views.  Initi
b6e0: 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74  alize zType at t
b6f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
b700: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
b710: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
b720: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
b730: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
b740: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  /* sqlite3VdbeAd
b750: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
b760: 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30  Table, p->iDb, 0
b770: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ); */.      zTyp
b780: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
b790: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
b7a0: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
b7b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
b7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
b7d0: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
b7e0: 2f 2a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /*  sqlite3VdbeA
b7f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
b800: 65 72 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a 20 20  er, 0, 0); */.  
b810: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
b820: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
b830: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
b840: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
b850: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
b860: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
b870: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
b880: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
b890: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
b8a0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
b8b0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
b8c0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
b8d0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
b8e0: 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74  ew table is on t
b8f0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64  he top of the vd
b900: 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  be stack..    **
b910: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
b920: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
b930: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
b940: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
b950: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
b960: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
b970: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
b980: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
b990: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
b9a0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
b9b0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
b9c0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b9d0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
b9e0: 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71  SelTab;.      sq
b9f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ba00: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
ba10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ba20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
ba30: 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30  teger, p->iDb, 0
ba40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ba50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ba60: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29  OpenWrite, 1, 0)
ba70: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
ba80: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
ba90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
baa0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53  arse, pSelect, S
bab0: 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20  RT_Table, 1, 0, 
bac0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
bad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bae0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
baf0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
bb00: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
bb10: 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  {.        pSelTa
bb20: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
bb30: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
bb40: 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29  rse, 0, pSelect)
bb50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
bb60: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
bb70: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
bb80: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
bb90: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  .        p->nCol
bba0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
bbb0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  ;.        p->aCo
bbc0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
bbd0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
bbe0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
bbf0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
bc00: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
bc10: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
bc20: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
bc30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
bc40: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
bc50: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
bc60: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
bc70: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
bc80: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
bc90: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
bca0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b  ateTableStmt(p);
bcb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bcc0: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
bcd0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
bce0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
bcf0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d   + 1;.      zStm
bd00: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
bd10: 74 66 28 22 43 52 45 41 54 45 20 25 73 20 25 2e  tf("CREATE %s %.
bd20: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
bd30: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
bd40: 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  en.z);.    }..  
bd50: 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
bd60: 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
bd70: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
bd80: 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
bd90: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
bda0: 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
bdb0: 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
bdc0: 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
bdd0: 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
bde0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
bdf0: 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68  e collected.  Th
be00: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
be10: 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  preallocated.   
be20: 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20   ** slot is the 
be30: 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  2nd item on the 
be40: 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20  stack.  The top 
be50: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20  of the stack is 
be60: 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
be70: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
be80: 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69   table (or a 0 i
be90: 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77  f this is a view
bea0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
beb0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
bec0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
bed0: 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20  UPDATE %Q.%s ". 
bee0: 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70          "SET typ
bef0: 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c  e='%s', name=%Q,
bf00: 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f   tbl_name=%Q, ro
bf10: 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25  otpage=#0, sql=%
bf20: 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
bf30: 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20  E rowid=#1",.   
bf40: 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44     db->aDb[p->iD
bf50: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
bf60: 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a  _TABLE(p->iDb),.
bf70: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
bf80: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
bf90: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
bfa0: 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
bfb0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
bfc0: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
bfd0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
bfe0: 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a  b, v, p->iDb);..
bff0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c000: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
c010: 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
c020: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
c030: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
c040: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
c050: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
c060: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
c070: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
c080: 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
c090: 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  f( p->autoInc ){
c0a0: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
c0b0: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
c0c0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ];.      if( pDb
c0d0: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
c0e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
c0f0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c100: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
c110: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
c120: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
c130: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
c140: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
c150: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
c160: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
c170: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
c180: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
c190: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
c1a0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
c1b0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
c1c0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
c1d0: 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62  seSchema, p->iDb
c1e0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
c1f0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c  ite3MPrintf("tbl
c200: 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a  _name='%q'",p->z
c210: 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49  Name), P3_DYNAMI
c220: 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  C);.  }...  /* A
c230: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
c240: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
c250: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
c260: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
c270: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
c280: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
c290: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
c2a0: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
c2b0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a    FKey *pFKey; .
c2c0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
c2d0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a  b->aDb[p->iDb];.
c2e0: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
c2f0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
c300: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
c310: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
c320: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
c330: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
c340: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
c350: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
c360: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
c370: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
c380: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
c390: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69  return;.    }.#i
c3a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c3b0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
c3c0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
c3d0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
c3e0: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
c3f0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
c400: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
c410: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
c420: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
c430: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
c440: 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79  Find(&pDb->aFKey
c450: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
c460: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
c470: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
c480: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
c490: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
c4a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c4b0: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
c4c0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
c4d0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
c4e0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
c4f0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
c500: 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  s;.  }.}..#ifnde
c510: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c520: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
c530: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
c540: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
c550: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
c560: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
c570: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
c580: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c590: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
c5a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c5b0: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
c5c0: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
c5d0: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
c5e0: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
c5f0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
c600: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
c610: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
c620: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c630: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
c640: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
c650: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
c660: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
c670: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
c680: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
c690: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
c6a0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
c6b0: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
c6c0: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
c6d0: 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20   isTemp         
c6e0: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
c6f0: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
c700: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
c710: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
c720: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c730: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
c740: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
c750: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
c760: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
c770: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65  able(pParse, pBe
c780: 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  gin, pName1, pNa
c790: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b  me2, isTemp, 1);
c7a0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
c7b0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
c7c0: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
c7d0: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
c7e0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c7f0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c800: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
c810: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
c820: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
c830: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
c840: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
c850: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
c860: 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65  se, p->iDb, "vie
c870: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
c880: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
c890: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
c8a0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
c8b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c8c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c8d0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
c8e0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
c8f0: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
c900: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
c910: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
c920: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
c930: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
c940: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
c950: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
c960: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
c970: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
c980: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
c990: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
c9a0: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
c9b0: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
c9c0: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
c9d0: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
c9e0: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
c9f0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
ca00: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
ca10: 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29  lectDup(pSelect)
ca20: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
ca30: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
ca40: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
ca50: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  >db->init.busy )
ca60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
ca70: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
ca80: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
ca90: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
caa0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
cab0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
cac0: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
cad0: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
cae0: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
caf0: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
cb00: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
cb10: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
cb20: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
cb30: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
cb40: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
cb50: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e  n = 0;.  n = sEn
cb60: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b  d.z - pBegin->z;
cb70: 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e  .  z = (const un
cb80: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65  signed char*)pBe
cb90: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
cba0: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
cbb0: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
cbc0: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
cbd0: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
cbe0: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
cbf0: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
cc00: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
cc10: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
cc20: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
cc30: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
cc40: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
cc50: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
cc60: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
cc70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cc80: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
cc90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cca0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
ccb0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
ccc0: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
ccd0: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
cce0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
ccf0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
cd00: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
cd10: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
cd20: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
cd30: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
cd40: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
cd50: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
cd60: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
cd70: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
cd80: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
cd90: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
cda0: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
cdb0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
cdc0: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
cdd0: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
cde0: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
cdf0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
ce00: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
ce10: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
ce20: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
ce30: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
ce40: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
ce50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
ce60: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
ce70: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
ce80: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
ce90: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
cea0: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
ceb0: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
cec0: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
ced0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
cee0: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a   pTable );..  /*
cef0: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
cf00: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
cf10: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
cf20: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
cf30: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
cf40: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
cf50: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
cf60: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
cf70: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
cf80: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
cf90: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
cfa0: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
cfb0: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
cfc0: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
cfd0: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
cfe0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
cff0: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
d000: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
d010: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
d020: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
d030: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
d040: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
d050: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
d060: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
d070: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
d080: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
d090: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
d0a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
d0b0: 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20  lly, this error 
d0c0: 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f  is caught previo
d0d0: 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20  usly and so the 
d0e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20  following test. 
d0f0: 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   ** should alway
d100: 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20  s fail.  But we 
d110: 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e  will leave it in
d120: 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62   place just to b
d130: 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69  e safe..  */.  i
d140: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
d150: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d170: 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
d180: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
d190: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
d1a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
d1b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
d1c0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
d1d0: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
d1e0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
d1f0: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
d200: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
d210: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
d220: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
d230: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
d240: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
d250: 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
d260: 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
d270: 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
d280: 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
d290: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
d2a0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
d2b0: 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
d2c0: 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
d2d0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
d2e0: 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
d2f0: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
d300: 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
d310: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
d320: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
d330: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
d340: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
d350: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
d360: 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
d370: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
d380: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
d390: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  );.  n = pParse-
d3a0: 3e 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >nTab;.  sqlite3
d3b0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
d3c0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
d3d0: 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 70 54 61 62  l->pSrc);.  pTab
d3e0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
d3f0: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
d400: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
d410: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
d420: 53 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Sel);.  pParse->
d430: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 69 66 28 20  nTab = n;.  if( 
d440: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61  pSelTab ){.    a
d450: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
d460: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  Col==0 );.    pT
d470: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
d480: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
d490: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
d4a0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
d4b0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
d4c0: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
d4d0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
d4e0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
d4f0: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
d500: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
d510: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
d520: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
d530: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
d540: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
d550: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
d560: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
d570: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d580: 65 28 70 53 65 6c 29 3b 0a 20 20 72 65 74 75 72  e(pSel);.  retur
d590: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
d5a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d5b0: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64  T_VIEW */..#ifnd
d5c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d5d0: 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
d5e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
d5f0: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
d600: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
d610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d620: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
d630: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
d640: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
d650: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
d660: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
d670: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
d680: 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
d690: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
d6a0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
d6b0: 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68  aDb[idx].tblHash
d6c0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
d6d0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
d6e0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
d6f0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
d700: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
d710: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
d720: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
d730: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
d740: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
d750: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
d760: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
d770: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
d780: 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
d790: 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
d7a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d7b0: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
d7c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d7d0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
d7e0: 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
d7f0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
d800: 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
d810: 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
d820: 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
d830: 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
d840: 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
d850: 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
d860: 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
d870: 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
d880: 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
d890: 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23  .** to iTo..*/.#
d8a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d8b0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
d8c0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
d8d0: 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c  geMoved(Db *pDb,
d8e0: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
d8f0: 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
d900: 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f   *pElem;.  .  fo
d910: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
d920: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62  shFirst(&pDb->tb
d930: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
d940: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
d950: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
d960: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
d970: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
d980: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
d990: 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
d9a0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
d9b0: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20  num = iTo;.     
d9c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
d9d0: 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73   }.  for(pElem=s
d9e0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
d9f0: 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  pDb->idxHash); p
da00: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
da10: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
da20: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
da30: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
da40: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
da50: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
da60: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
da70: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
da80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
da90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
daa0: 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rt(0);.}.#endif.
dab0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
dac0: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
dad0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
dae0: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
daf0: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
db00: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
db10: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
db20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
db30: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
db40: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
db50: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
db60: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
db70: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
db80: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
db90: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
dba0: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
dbb0: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
dbc0: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
dbd0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
dbe0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
dbf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
dc00: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
dc10: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
dc20: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
dc30: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
dc40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dc50: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
dc60: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
dc70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
dc80: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
dc90: 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e  estroy pushes an
dca0: 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68   integer onto th
dcb0: 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73  e stack. If this
dcc0: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
dcd0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
dce0: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
dcf0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
dd00: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
dd10: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
dd20: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
dd30: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
dd40: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
dd50: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
dd60: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
dd70: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30   **.  ** The "#0
dd80: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
dd90: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
dda0: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
ddb0: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
ddc0: 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  * is on the top 
ddd0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  of the stack.  S
dde0: 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  ee sqlite3Regist
ddf0: 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20  erExpr()..  */. 
de00: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
de10: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
de20: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
de30: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
de40: 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f  WHERE #0 AND roo
de50: 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20  tpage=#0",.     
de60: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
de70: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
de80: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
de90: 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d  Table);.#endif.}
dea0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
deb0: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
dec0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
ded0: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
dee0: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
def0: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
df00: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
df10: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
df20: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
df30: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
df40: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
df50: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
df60: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
df70: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
df80: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
df90: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
dfa0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
dfb0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
dfc0: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
dfd0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
dfe0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
dff0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
e000: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e010: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e020: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
e030: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
e040: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
e050: 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29  tnum, pTab->iDb)
e060: 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
e070: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e080: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e090: 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
e0a0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
e0b0: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78  pIdx->tnum, pIdx
e0c0: 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  ->iDb);.  }.#els
e0d0: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
e0e0: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
e0f0: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
e100: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
e110: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
e120: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
e130: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
e140: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
e150: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
e160: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
e170: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
e180: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
e190: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
e1a0: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
e1b0: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
e1c0: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
e1d0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
e1e0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
e1f0: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
e200: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
e210: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
e220: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
e230: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
e240: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
e250: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
e260: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
e270: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
e280: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
e290: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
e2a0: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
e2b0: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
e2c0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
e2d0: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
e2e0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
e2f0: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
e300: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
e310: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
e320: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
e330: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
e340: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
e350: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
e360: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
e370: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
e380: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
e390: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
e3a0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
e3b0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
e3c0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
e3d0: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
e3e0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
e3f0: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
e400: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
e410: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
e420: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
e430: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
e440: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e450: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e460: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
e470: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
e480: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e490: 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e  Idx->iDb==pTab->
e4a0: 69 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  iDb );.      if(
e4b0: 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
e4c0: 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
e4d0: 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
e4e0: 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
e4f0: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
e500: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
e510: 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
e520: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
e530: 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
e540: 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67  ge(pParse, iLarg
e550: 65 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  est, pTab->iDb);
e560: 0a 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20  .    iDestroyed 
e570: 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a  = iLargest;.  }.
e580: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e590: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e5a0: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
e5b0: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
e5c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e5d0: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
e5e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
e5f0: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
e600: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e610: 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
e620: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
e630: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
e640: 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a  View){.  Table *
e650: 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  pTab;.  Vdbe *v;
e660: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e670: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
e680: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
e690: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
e6a0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
e6b0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
e6c0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61  _drop_table;.  a
e6d0: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
e6e0: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
e6f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
e700: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
e710: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
e720: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
e730: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
e740: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
e750: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e760: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
e770: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
e780: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
e790: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
e7a0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
e7b0: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
e7c0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
e7d0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
e7e0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
e7f0: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  b->iDb);.    con
e800: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
e810: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
e820: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
e830: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
e840: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
e850: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
e860: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
e870: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e880: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
e890: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
e8a0: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
e8b0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
e8c0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
e8d0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
e8e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
e8f0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
e900: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
e910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
e920: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
e930: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
e940: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
e950: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
e960: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e970: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
e980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e9a0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e9b0: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
e9c0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
e9d0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
e9e0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
e9f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
ea00: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
ea10: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
ea20: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
ea30: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
ea40: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
ea50: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
ea60: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
ea70: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54  ->readOnly || pT
ea80: 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ab==db->aDb[iDb]
ea90: 2e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  .pSeqTab ){.    
eaa0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
eab0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
eac0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
ead0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
eae0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
eaf0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
eb00: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
eb10: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
eb20: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
eb30: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
eb40: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
eb50: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
eb60: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
eb70: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
eb80: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
eb90: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
eba0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ebb0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
ebc0: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
ebd0: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
ebe0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
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 7d 0a 20 20 69 66  _table;.  }.  if
ec10: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
ec20: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
ec30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ec40: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
ec50: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
ec60: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
ec70: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
ec80: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
ec90: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
eca0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
ecb0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
ecc0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
ecd0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
ece0: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
ecf0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
ed00: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ed10: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
ed20: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
ed30: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70  .    int iDb = p
ed40: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62  Tab->iDb;.    Db
ed50: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
ed60: 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
ed70: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
ed80: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
ed90: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44   iDb);..    /* D
eda0: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
edb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
edc0: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
edd0: 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
ede0: 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
edf0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
ee00: 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
ee10: 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
ee20: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
ee30: 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
ee40: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
ee50: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
ee60: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
ee70: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
ee80: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
ee90: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
eea0: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
eeb0: 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20  >iDb==1 );.     
eec0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
eed0: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
eee0: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
eef0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
ef00: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
ef10: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
ef20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
ef30: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52  CREMENT.    /* R
ef40: 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
ef50: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
ef60: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
ef70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
ef80: 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
ef90: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
efa0: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
efb0: 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
efc0: 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61  dropped.    ** a
efd0: 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
efe0: 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
eff0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
f000: 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
f010: 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72    ** move as a r
f020: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f  esult of the dro
f030: 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e  p (can happen in
f040: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
f050: 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e)..    */.    i
f060: 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63  f( pTab->autoInc
f070: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f080: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
f090: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
f0a0: 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c  LETE FROM %s.sql
f0b0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
f0c0: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
f0d0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
f0e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
f0f0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
f100: 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
f110: 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
f120: 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
f130: 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
f140: 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
f150: 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
f160: 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
f170: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
f180: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
f190: 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
f1a0: 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
f1b0: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
f1c0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
f1d0: 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
f1e0: 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
f1f0: 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
f200: 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
f210: 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
f220: 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
f230: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
f240: 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
f250: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
f260: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
f270: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
f280: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
f290: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
f2a0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
f2b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
f2c0: 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
f2d0: 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
f2e0: 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
f2f0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
f300: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
f310: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
f320: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
f330: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
f340: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
f350: 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
f360: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
f370: 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
f380: 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
f390: 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
f3a0: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
f3b0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
f3c0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
f3d0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
f3e0: 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70  Table, iDb, 0, p
f3f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
f400: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
f410: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
f420: 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
f430: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
f440: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
f450: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
f460: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
f470: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
f480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f490: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
f4a0: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
f4b0: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
f4c0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
f4d0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
f4e0: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
f4f0: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
f500: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
f510: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
f520: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
f530: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
f540: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
f550: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
f560: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
f570: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
f580: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
f590: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
f5a0: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
f5b0: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
f5c0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
f5d0: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
f5e0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
f5f0: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
f600: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
f610: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
f620: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
f630: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
f640: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
f650: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
f660: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
f670: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
f680: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
f690: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
f6a0: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
f6b0: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
f6c0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
f6d0: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
f6e0: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
f6f0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
f700: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
f710: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
f720: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
f730: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
f740: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
f750: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
f760: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
f770: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
f780: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
f790: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
f7a0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
f7b0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
f7c0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
f7d0: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
f7e0: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
f7f0: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
f800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
f810: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
f820: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f830: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
f840: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
f850: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
f860: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
f870: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
f880: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
f890: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
f8a0: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
f8b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
f8c0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
f8d0: 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
f8e0: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
f8f0: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
f900: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
f910: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
f920: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
f930: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
f940: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f950: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f960: 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
f970: 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Key = 0;.  Table
f980: 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
f990: 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
f9a0: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
f9b0: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
f9c0: 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
f9d0: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
f9e0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
f9f0: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
fa00: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
fa10: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
fa20: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
fa30: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
fa40: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
fa50: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
fa60: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
fa70: 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
fa80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fa90: 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
faa0: 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
fab0: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
fac0: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
fad0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
fae0: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
faf0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
fb00: 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
fb10: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
fb20: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
fb30: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
fb40: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
fb50: 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
fb60: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
fb70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fb80: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
fb90: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
fba0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
fbb0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
fbc0: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
fbd0: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
fbe0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
fbf0: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
fc00: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
fc10: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
fc20: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
fc30: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
fc40: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
fc50: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
fc60: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
fc70: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
fc80: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
fc90: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
fca0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
fcb0: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
fcc0: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
fcd0: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
fce0: 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
fcf0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
fd00: 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
fd10: 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  ==0 ) goto fk_en
fd20: 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f  d;.  pFKey->pFro
fd30: 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
fd40: 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
fd50: 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
fd60: 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
fd70: 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
fd80: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
fd90: 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
fda0: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
fdb0: 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
fdc0: 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
fdd0: 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
fde0: 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
fdf0: 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
fe00: 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
fe10: 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
fe20: 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
fe30: 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
fe40: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
fe50: 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
fe60: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
fe70: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
fe80: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
fe90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
fea0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
feb0: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
fec0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
fed0: 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
fee0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
fef0: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
ff00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ff10: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
ff20: 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
ff30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ff40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ff50: 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
ff60: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
ff70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ff80: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
ff90: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
ffa0: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
ffb0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
ffc0: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
ffd0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
ffe0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
fff0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
10000 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10010 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
10020 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
10030 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
10040 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
10050 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
10060 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
10070 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
10080 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
10090 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
100a0 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
100b0 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
100c0 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
100d0 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
100e0 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
100f0 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
10100 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
10110 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
10120 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
10130 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
10140 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
10150 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
10160 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
10170 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
10180 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
10190 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
101a0 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
101b0 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
101c0 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
101d0 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
101e0 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
101f0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
10200 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10210 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
10220 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
10230 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
10240 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
10250 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
10260 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10270 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
10280 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
10290 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
102a0 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
102b0 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
102c0 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
102d0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
102e0 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
102f0 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
10300 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
10310 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
10320 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
10330 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
10340 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
10350 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
10360 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
10370 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
10380 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
10390 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
103a0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
103b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
103c0 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
103d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103e0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
103f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
10400 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
10410 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
10420 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
10430 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
10440 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
10450 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
10460 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
10470 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
10480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
10490 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
104a0 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
104b0 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
104c0 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
104d0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
104e0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
104f0 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
10500 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
10510 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
10520 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
10530 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
10540 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
10550 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
10560 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
10570 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
10580 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
10590 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ted.  The memory
105a0 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20   cell specified 
105b0 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
105c0 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
105d0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
105e0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
105f0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
10600 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
10610 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
10620 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
10630 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
10640 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
10650 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
10660 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
10670 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
10680 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
10690 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
106a0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
106b0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
106c0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
106d0 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
106e0 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
106f0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
10700 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
10710 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
10720 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
10730 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
10740 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f  e->nTab;       /
10750 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
10760 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
10770 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
10780 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20  rse->nTab+1;    
10790 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
107a0 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
107b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
107e0 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
107f0 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
10820 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  of index */.  Vd
10830 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10850 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
10860 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
10870 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  machine */.  int
10880 20 69 73 55 6e 69 71 75 65 3b 20 20 20 20 20 20   isUnique;      
10890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
108a0 72 75 65 20 66 6f 72 20 61 20 75 6e 69 71 75 65  rue for a unique
108b0 20 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64   index */..#ifnd
108c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
108d0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
108e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
108f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
10900 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
10910 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
10920 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
10930 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
10940 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
10950 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
10960 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  if..  /* Ensure 
10970 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 64  all the required
10980 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
10990 6e 63 65 73 20 61 72 65 20 61 76 61 69 6c 61 62  nces are availab
109a0 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 72 6f  le. This.  ** ro
109b0 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 76 6f 6b  utine will invok
109c0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d  e the collation-
109d0 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20  needed callback 
109e0 69 66 20 6e 65 63 65 73 73 61 72 79 20 28 61 6e  if necessary (an
109f0 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 68 61  d.  ** if one ha
10a00 73 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  s been registere
10a10 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  d)..  */.  if( s
10a20 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78  qlite3CheckIndex
10a30 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10a40 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 72  pIndex) ){.    r
10a50 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 76 20  eturn;.  }..  v 
10a60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10a70 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
10a80 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
10a90 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
10aa0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
10ab0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10ac0 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
10ad0 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
10ae0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
10af0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
10b00 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
10b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b20 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
10b30 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  um, pIndex->iDb)
10b40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10b50 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10b60 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e  nteger, pIndex->
10b70 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  iDb, 0);.  sqlit
10b80 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
10b90 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
10ba0 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20   tnum,.         
10bb0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
10bc0 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
10bd0 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
10be0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10bf0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
10c00 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
10c10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10c20 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
10c30 65 61 64 2c 20 69 54 61 62 2c 20 70 54 61 62 2d  ead, iTab, pTab-
10c40 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >tnum);.  sqlite
10c50 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10c60 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
10c70 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  iTab, pTab->nCol
10c80 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
10c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10ca0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
10cb0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  , 0);.  sqlite3G
10cc0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
10cd0 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29  v, pIndex, iTab)
10ce0 3b 0a 20 20 69 73 55 6e 69 71 75 65 20 3d 20 70  ;.  isUnique = p
10cf0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
10d00 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c 69 74  OE_None;.  sqlit
10d10 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10d20 50 5f 49 64 78 50 75 74 2c 20 69 49 64 78 2c 20  P_IdxPut, iIdx, 
10d30 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 69 66 28  isUnique);.  if(
10d40 20 69 73 55 6e 69 71 75 65 20 29 7b 0a 20 20 20   isUnique ){.   
10d50 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10d60 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64  geP3(v, -1, "ind
10d70 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
10d80 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
10d90 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20  _STATIC);.  }.  
10da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10db0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
10dc0 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73  b, addr1+1);.  s
10dd0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10de0 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c  P2(v, addr1, sql
10df0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10e00 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74  ddr(v));.  sqlit
10e10 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10e20 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30  P_Close, iTab, 0
10e30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10e40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
10e50 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a  e, iIdx, 0);.}..
10e60 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
10e70 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
10e80 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
10e90 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
10ea0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
10eb0 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
10ec0 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
10ed0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
10ee0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
10ef0 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
10f00 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
10f10 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
10f20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
10f30 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
10f40 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
10f50 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
10f60 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
10f70 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
10f80 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10f90 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
10fa0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
10fb0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
10fc0 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
10fd0 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
10fe0 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
10ff0 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
11000 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
11010 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
11020 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
11030 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
11040 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
11050 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
11060 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
11070 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
11080 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
11090 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
110a0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
110b0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
110c0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
110d0 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
110e0 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
110f0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
11100 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
11110 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
11120 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
11130 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
11140 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
11150 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
11160 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
11170 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
11180 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
11190 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
111a0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
111b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
111c0 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
111d0 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
111e0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
111f0 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
11200 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
11210 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
11220 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
11230 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
11240 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
11250 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
11260 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
11270 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
11280 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
11290 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
112a0 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
112b0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
112c0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
112d0 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 20  ken *pEnd       
112e0 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
112f0 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
11300 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
11310 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
11320 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a   *pTab = 0;   /*
11330 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
11340 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
11350 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20  *pIndex = 0; /* 
11360 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
11370 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
11380 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
11390 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
113a0 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20  n nullId;    /* 
113b0 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
113c0 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
113d0 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
113e0 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73  x;    /* For ass
113f0 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
11400 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
11410 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b  */.  int isTemp;
11420 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
11430 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e  r a temporary in
11440 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dex */.  sqlite3
11450 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11460 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  b;..  int iDb;  
11470 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11480 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11490 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
114a0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
114b0 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  n *pName = 0; /*
114c0 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
114d0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
114e0 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69  o create */..  i
114f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
11500 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
11510 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
11520 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11530 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  x;..  /*.  ** Fi
11540 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
11550 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
11560 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
11570 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
11580 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
11590 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
115a0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
115b0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
115c0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
115d0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
115e0 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
115f0 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
11600 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
11610 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
11620 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
11630 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
11640 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11650 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
11660 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
11670 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
11680 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
11690 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
116a0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
116b0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
116c0 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f  te_index;..    /
116d0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
116e0 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
116f0 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
11700 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
11710 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
11720 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
11730 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
11740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61  ..    */.    pTa
11750 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
11760 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
11770 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
11780 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
11790 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
117a0 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d  ab && pTab->iDb=
117b0 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20  =1 ){.      iDb 
117c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
117d0 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
117e0 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
117f0 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
11800 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20  pName) &&.      
11810 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c    sqlite3FixSrcL
11820 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
11830 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ame).    ){.    
11840 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
11850 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
11860 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
11870 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
11880 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e  arse, pTblName->
11890 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  a[0].zName, .   
118a0 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61       pTblName->a
118b0 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
118c0 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
118d0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
118e0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
118f0 72 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69  rt( iDb==pTab->i
11900 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Db );.  }else{. 
11910 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
11920 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
11930 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
11940 61 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20  able;.    iDb = 
11950 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a  pTab->iDb;.  }..
11960 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
11970 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
11980 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11990 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
119a0 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
119b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
119c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
119d0 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
119e0 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
119f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
11a00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11a10 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
11a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11a30 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
11a40 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
11a50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11a60 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
11a70 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
11a80 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
11a90 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11aa0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 73 54 65 6d  }.#endif.  isTem
11ab0 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31  p = pTab->iDb==1
11ac0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
11ad0 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
11ae0 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
11af0 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
11b00 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
11b10 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
11b20 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
11b30 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
11b40 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
11b50 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
11b60 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
11b70 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
11b80 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
11b90 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
11ba0 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
11bb0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
11bc0 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
11bd0 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
11be0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
11bf0 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
11c00 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
11c10 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
11c20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
11c30 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
11c40 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
11c50 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
11c60 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
11c70 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
11c80 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
11c90 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
11ca0 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
11cb0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
11cc0 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
11cd0 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
11ce0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
11cf0 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
11d00 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
11d10 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
11d20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
11d30 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
11d40 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
11d50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11d60 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a  index;.    if( z
11d70 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
11d80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11d90 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
11da0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
11db0 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
11dc0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
11dd0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
11de0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11df0 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
11e00 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
11e10 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e    Index *pISameN
11e20 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ame;    /* Anoth
11e30 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  er index with th
11e40 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  e same name */. 
11e50 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61       Table *pTSa
11e60 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20  meName;    /* A 
11e70 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20  table with same 
11e80 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65  name as the inde
11e90 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53  x */.      if( S
11ea0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
11eb0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
11ec0 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
11ed0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11ee0 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
11ef0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ame = sqlite3Fin
11f00 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
11f10 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
11f20 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Name))!=0 ){.   
11f30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11f40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
11f50 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
11f60 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
11f70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
11f80 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11fa0 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pTSameName = 
11fb0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
11fc0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21  (db, zName, 0))!
11fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
11fe0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11ff0 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
12000 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
12010 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
12020 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
12030 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12040 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
12050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
12060 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
12070 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
12080 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
12090 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
120a0 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
120b0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
120c0 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
120d0 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f   sprintf(zBuf,"_
120e0 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  %d",n);.    zNam
120f0 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
12100 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
12110 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
12120 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a  index_", pTab->z
12130 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61  Name, zBuf, (cha
12140 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  r*)0);.    if( z
12150 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
12160 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
12180 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
12190 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
121a0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
121b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
121c0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
121d0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
121e0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
121f0 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  [pTab->iDb].zNam
12200 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
12210 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
12220 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
12230 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
12240 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
12250 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
12260 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
12280 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
12290 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54  DEX;.    if( isT
122a0 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45  emp ) i = SQLITE
122b0 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
122c0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
122d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
122e0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
122f0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
12300 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
12310 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
12330 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
12340 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
12350 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
12360 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
12370 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
12380 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
12390 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
123a0 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
123b0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
123c0 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
123d0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
123e0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
123f0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
12400 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
12410 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54   = pTab->aCol[pT
12420 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
12430 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
12440 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e  = strlen(nullId.
12450 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  z);.    pList = 
12460 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
12470 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c  ppend(0, 0, &nul
12480 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  lId);.    if( pL
12490 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
124a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
124b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
124c0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
124d0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
124e0 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20    */.  pIndex = 
124f0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
12500 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74  zeof(Index) + st
12510 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20  rlen(zName) + 1 
12520 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
12530 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
12540 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
12550 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74  CollSeq*))*pList
12560 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66 28  ->nExpr );.  if(
12570 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
12580 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12590 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
125a0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
125b0 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  &pIndex->keyInfo
125c0 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45  .aColl[pList->nE
125d0 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  xpr];.  pIndex->
125e0 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
125f0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
12600 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
12610 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
12620 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
12630 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
12640 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
12650 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
12660 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
12670 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
12680 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
12690 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
126a0 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
126b0 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20  ->iDb = iDb;..  
126c0 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
126d0 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
126e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
126f0 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
12700 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
12710 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
12720 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
12730 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
12740 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
12750 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
12760 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
12770 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
12780 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12790 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
127a0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
127b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
127c0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
127d0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
127e0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
127f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12800 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
12810 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
12820 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12830 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
12840 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
12850 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
12860 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
12870 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
12880 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
12890 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
128a0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
128b0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
128c0 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70  ] = j;.    if( p
128d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
128e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
128f0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ( pList->a[i].pE
12900 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
12910 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
12920 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
12930 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12940 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  ->pColl;.    }el
12950 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  se{.      pIndex
12960 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12970 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  i] = pTab->aCol[
12980 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].pColl;.    }.
12990 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
129a0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
129b0 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  l[i] );.    if( 
129c0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
129d0 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
129e0 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
129f0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b  Parse, pIndex->k
12a00 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
12a10 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
12a20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12a30 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
12a40 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
12a50 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73  fo.nField = pLis
12a60 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28  t->nExpr;..  if(
12a70 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
12a80 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
12a90 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
12aa0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
12ab0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
12ac0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
12ad0 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
12ae0 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
12af0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
12b00 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
12b10 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
12b20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
12b30 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
12b40 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
12b50 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
12b60 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
12b70 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
12b80 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
12b90 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
12ba0 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
12bb0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
12bc0 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
12bd0 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
12be0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
12bf0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
12c00 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
12c10 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
12c20 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
12c30 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
12c40 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
12c50 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
12c60 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
12c70 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
12c80 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
12c90 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
12ca0 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
12cb0 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
12cc0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
12cd0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
12ce0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
12cf0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
12d00 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
12d10 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
12d20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
12d30 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
12d40 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
12d50 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
12d60 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
12d70 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
12d80 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
12d90 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
12da0 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
12db0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
12dc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
12dd0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
12de0 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
12df0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
12e00 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
12e10 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
12e20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12e30 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  if( pIdx->keyInf
12e40 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64  o.aColl[k]!=pInd
12e50 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
12e60 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  l[k] ) break;.  
12e70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12e80 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
12e90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12ea0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
12eb0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
12ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
12ed0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
12ee0 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
12ef0 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
12f00 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
12f10 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
12f20 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
12f30 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
12f40 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
12f50 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
12f60 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
12f70 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
12f80 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
12f90 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
12fa0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
12fb0 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
12fc0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
12fd0 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
12fe0 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
12ff0 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
13000 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
13010 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
13020 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
13030 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
13040 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
13050 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
13060 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
13070 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
13080 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
13090 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
130a0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
130b0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
130c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
130d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
130e0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
130f0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
13100 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
13110 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
13120 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
13130 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
13140 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
13150 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
13160 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
13170 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
13180 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
13190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
131a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
131b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
131c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
131d0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
131e0 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
131f0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
13200 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
13210 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
13220 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
13230 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
13240 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
13250 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
13260 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
13270 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
13280 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
13290 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  b].idxHash, .   
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
132c0 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
132d0 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
132e0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
132f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13300 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
13310 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
13320 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
13330 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13340 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13350 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
13360 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
13370 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
13380 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
13390 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
133a0 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
133b0 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
133c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
133d0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
133e0 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
133f0 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
13400 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
13410 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
13420 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
13430 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
13440 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
13450 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
13460 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
13470 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
13480 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
13490 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
134a0 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
134b0 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
134c0 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
134d0 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
134e0 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
134f0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
13500 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
13510 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
13520 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
13530 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
13540 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
13550 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
13560 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
13570 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
13580 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
13590 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
135a0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
135b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
135c0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
135d0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
135e0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
135f0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
13600 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
13610 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
13620 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
13630 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
13640 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
13650 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
13660 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
13670 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
13680 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
13690 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
136a0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
136b0 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
136c0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
136d0 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
136e0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
136f0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
13700 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20  rse->nMem++;..  
13710 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13720 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13730 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
13740 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13750 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  dex;..    /* Cre
13760 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
13770 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
13780 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
13790 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
137a0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
137b0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
137c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
137d0 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
137e0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
137f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13800 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
13810 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  , 0);..    /* Ga
13820 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
13830 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
13840 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
13850 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
13860 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
13870 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
13880 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
13890 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  d ){.      /* A 
138a0 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
138b0 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
138c0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
138d0 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
138e0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
138f0 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e  ntf("CREATE%s IN
13900 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
13910 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
13920 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
13930 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 41 64  QUE",.        Ad
13940 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
13950 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31  dr(pName->z) + 1
13960 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d  ,.        pName-
13970 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
13980 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
13990 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
139a0 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
139b0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
139c0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
139d0 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
139e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
139f0 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  ; */.      zStmt
13a00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
13a10 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
13a20 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   in sqlite_maste
13a30 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  r for this index
13a40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
13a50 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13a60 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
13a70 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
13a80 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
13a90 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22  ',%Q,%Q,#0,%Q);"
13aa0 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
13ab0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
13ac0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
13ad0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
13ae0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
13af0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
13b00 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
13b10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13b20 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
13b30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
13b40 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a  iteFree(zStmt);.
13b50 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
13b60 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
13b70 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
13b80 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
13b90 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
13ba0 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
13bb0 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
13bc0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
13bd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
13be0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
13bf0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
13c00 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
13c10 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
13c20 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
13c30 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20  e(db, v, iDb);. 
13c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13c50 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(v, OP_ParseS
13c60 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20  chema, iDb, 0,. 
13c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
13c80 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71  Printf("name='%q
13c90 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
13ca0 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  e), P3_DYNAMIC);
13cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13cc0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78  beAddOp(v, OP_Ex
13cd0 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pire, 0, 0);.   
13ce0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65   }.  }..  /* Whe
13cf0 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
13d00 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
13d10 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
13d20 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
13d30 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
13d40 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
13d50 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
13d60 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
13d70 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
13d80 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
13d90 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
13da0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
13db0 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64   UPDATE.  ** and
13dc0 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20   INSERT..  */.  
13dd0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
13de0 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
13df0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
13e00 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
13e10 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
13e20 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
13e30 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
13e40 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
13e50 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
13e60 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
13e70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
13e80 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
13e90 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
13ea0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
13eb0 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
13ec0 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
13ed0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
13ee0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
13ef0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
13f00 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
13f10 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
13f20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
13f30 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
13f40 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
13f50 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
13f60 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
13f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
13f80 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
13f90 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
13fa0 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
13fb0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
13fc0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
13fd0 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
13fe0 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ndex);.  }.  sql
13ff0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
14000 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
14010 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
14020 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  e(pTblName);.  s
14030 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
14040 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
14050 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14060 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
14070 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
14080 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
14090 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
140a0 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
140b0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
140c0 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
140d0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
140e0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
140f0 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
14100 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
14110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14120 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
14130 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
14140 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14150 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
14160 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14170 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
14180 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
14190 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
141a0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
141b0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
141c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
141d0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
141e0 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
141f0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
14200 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
14210 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
14220 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
14230 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
14240 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14250 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
14260 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
14270 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
14280 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
14290 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
142a0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
142b0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
142c0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
142d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
142e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
142f0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
14300 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
14310 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
14320 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
14330 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
14340 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
14350 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
14360 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
14370 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14380 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
14390 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
143a0 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
143b0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
143c0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
143d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
143e0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
143f0 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
14400 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14410 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
14420 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
14430 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
14440 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14450 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
14460 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
14470 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14480 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
14490 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
144a0 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
144b0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
144c0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
144d0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
144e0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
144f0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
14500 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
14510 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14520 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
14530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14540 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
14550 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
14560 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
14570 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
14580 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
14590 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
145a0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
145b0 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70  .    int iDb = p
145c0 49 6e 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20  Index->iDb;.    
145d0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
145e0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
145f0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
14600 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
14610 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  %Q",.       db->
14620 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
14630 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14640 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78  ),.       pIndex
14650 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
14660 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
14670 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
14680 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
14690 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
146a0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
146b0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
146c0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
146d0 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
146e0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
146f0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14700 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
14710 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14720 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
14730 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
14740 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
14750 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
14760 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
14770 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
14780 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
14790 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
147a0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
147b0 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
147c0 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
147d0 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
147e0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
147f0 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
14800 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
14810 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
14820 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
14830 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
14840 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
14850 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
14860 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
14870 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d  if( pList->nId>=
14880 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
14890 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
148a0 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
148b0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
148c0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
148d0 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 5;.    a = sql
148e0 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
148f0 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ->a, pList->nAll
14900 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  oc*sizeof(pList-
14910 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
14920 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
14930 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
14940 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
14950 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
14960 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
14970 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   a;.  }.  memset
14980 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
14990 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nId], 0, sizeo
149a0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
149b0 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  .  pList->a[pLis
149c0 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20  t->nId].zName = 
149d0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
149e0 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20  oken(pToken);.  
149f0 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
14a00 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
14a10 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
14a20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
14a30 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
14a40 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
14a50 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
14a60 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
14a70 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
14a80 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
14a90 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
14aa0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
14ab0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
14ac0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
14ad0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
14ae0 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
14af0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
14b00 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
14b10 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
14b20 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
14b30 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
14b40 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
14b50 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
14b60 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
14b70 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
14b80 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
14b90 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
14ba0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
14bb0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
14bc0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
14bd0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
14be0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
14bf0 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
14c00 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
14c10 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
14c20 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
14c30 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
14c40 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
14c50 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
14c60 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
14c70 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
14c80 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
14c90 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
14ca0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
14cb0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
14cc0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
14cd0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
14ce0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
14cf0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
14d00 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  pend(A,B,0);.**.
14d10 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
14d20 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
14d30 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
14d40 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
14d50 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
14d60 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
14d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
14d80 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
14d90 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
14da0 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
14db0 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
14dc0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
14dd0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
14de0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
14df0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
14e00 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54  Token *pTable, T
14e10 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29  oken *pDatabase)
14e20 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
14e30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14e40 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14e50 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
14e60 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
14e70 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
14e80 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
14e90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
14ea0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
14eb0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  1;.  }.  if( pLi
14ec0 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d  st->nSrc>=pList-
14ed0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
14ee0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
14ef0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
14f00 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d  *= 2;.    pNew =
14f10 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
14f20 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
14f30 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69       sizeof(*pLi
14f40 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41  st) + (pList->nA
14f50 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
14f60 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
14f70 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
14f80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
14f90 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
14fa0 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
14fb0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
14fc0 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
14fd0 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
14fe0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
14ff0 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ];.  memset(pIte
15000 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  m, 0, sizeof(pLi
15010 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
15020 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
15030 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
15040 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
15050 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
15060 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62  Database && pTab
15070 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  le ){.    Token 
15080 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
15090 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
150a0 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
150b0 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
150c0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
150d0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
150e0 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
150f0 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
15100 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
15110 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61  ameFromToken(pDa
15120 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d  tabase);.  pItem
15130 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ->iCursor = -1;.
15140 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b    pList->nSrc++;
15150 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
15160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
15170 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20   cursors to all 
15180 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
15190 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
151a0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
151b0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
151c0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
151d0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
151e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
151f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
15200 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
15210 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
15220 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
15230 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
15240 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
15250 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
15260 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
15270 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15280 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
15290 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
152a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
152b0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
152c0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
152d0 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d  ct->pSrc);.    }
152e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
152f0 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
15300 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
15310 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
15320 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
15330 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
15340 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
15350 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
15360 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
15370 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
15380 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
15390 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
153a0 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61  t->nSrc-1].zAlia
153b0 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
153c0 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
153d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
153e0 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
153f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15400 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
15410 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
15420 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
15430 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
15440 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
15450 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
15460 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
15470 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
15480 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
15490 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
154a0 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
154b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
154c0 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
154d0 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
154e0 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
154f0 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
15500 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
15510 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
15520 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
15530 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
15540 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
15550 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
15560 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
15570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
15580 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
15590 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
155a0 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
155b0 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
155c0 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
155d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
155e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
155f0 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
15600 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
15610 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
15620 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15630 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
15640 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
15650 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
15660 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
15670 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
15680 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
15690 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
156a0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
156b0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
156c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
156d0 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
156e0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
156f0 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
15700 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
15710 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
15720 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
15730 70 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70  pItem->pTab && p
15740 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72  Item->pTab->isTr
15750 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
15760 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
15770 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54  ble(0, pItem->pT
15780 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
15790 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
157a0 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  te(pItem->pSelec
157b0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
157c0 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
157d0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
157e0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
157f0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
15800 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
15810 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
15820 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
15830 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
15840 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
15850 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
15860 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
15870 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15880 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
15890 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
158a0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
158b0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
158c0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
158d0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
158e0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
158f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
15900 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
15910 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15920 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15930 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
15940 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
15950 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
15960 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15970 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
15980 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
15990 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
159a0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
159b0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
159c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
159d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
159e0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
159f0 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
15a00 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d  USIVE)+1);.    }
15a10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
15a20 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
15a30 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
15a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
15a50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
15a60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
15a70 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
15a80 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15a90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
15aa0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
15ab0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
15ac0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
15ad0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
15ae0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
15af0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
15b00 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
15b10 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
15b20 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15b30 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15b40 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
15b50 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
15b60 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
15b70 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
15b80 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15b90 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
15ba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15bb0 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
15bc0 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
15bd0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
15be0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
15bf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
15c00 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
15c10 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
15c20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15c30 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
15c40 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
15c50 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
15c60 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
15c70 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
15c80 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
15c90 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
15ca0 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
15cb0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
15cc0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
15cd0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
15ce0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
15cf0 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
15d00 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
15d10 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15d20 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
15d30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15d40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
15d50 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
15d60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
15d70 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
15d80 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
15d90 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
15da0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
15db0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
15dc0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
15dd0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
15de0 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
15df0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
15e00 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
15e10 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
15e20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
15e30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15e40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
15e50 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
15e60 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
15e70 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
15e80 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
15e90 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
15ea0 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53   0, 0, MAX_PAGES
15eb0 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  , &db->aDb[1].pB
15ec0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
15ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15ee0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15ef0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
15f00 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
15f10 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
15f20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
15f30 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
15f40 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
15f50 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
15f60 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
15f70 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
15f80 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
15f90 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
15fa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
15fb0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
15fc0 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d  Trans(db->aDb[1]
15fd0 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  .pBt, 1);.      
15fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15ff0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
16000 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16010 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
16020 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  get a write lock
16030 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   on ".          
16040 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64  "the temporary d
16050 61 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a  atabase file");.
16060 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
16070 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
16080 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
16090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
160a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
160b0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
160c0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76  code that will v
160d0 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
160e0 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72   cookie and star
160f0 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e  t.** a read-tran
16100 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20  saction for all 
16110 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  named database f
16120 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  iles..**.** It i
16130 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
16140 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b   all schema cook
16150 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20  ies be verified 
16160 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20  and all.** read 
16170 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20  transactions be 
16180 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
16190 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70  nything else hap
161a0 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56  pens in.** the V
161b0 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75  DBE program.  Bu
161c0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  t this routine c
161d0 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  an be called aft
161e0 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a  er much other.**
161f0 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67   code has been g
16200 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65  enerated.  So he
16210 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f  re is what we do
16220 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  :.**.** The firs
16230 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
16240 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
16250 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74  e code an OP_Got
16260 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a  o that.** will j
16270 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74  ump to a subrout
16280 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ine at the end o
16290 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20  f the program.  
162a0 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72  Then we.** recor
162b0 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  d every database
162c0 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20   that needs its 
162d0 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20  schema verified 
162e0 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65  in the.** pParse
162f0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65  ->cookieMask fie
16300 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65  ld.  Later, afte
16310 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65  r all other code
16320 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e   has been.** gen
16330 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72  erated, the subr
16340 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
16350 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
16360 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  fications and.**
16370 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e   starts the tran
16380 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65  sactions will be
16390 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f   coded and the O
163a0 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a  P_Goto P2 value.
163b0 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  ** will be made 
163c0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
163d0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
163e0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
163f0 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65  the.** cookie ve
16400 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f  rification subro
16410 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65  utine code happe
16420 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e  ns in sqlite3Fin
16430 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a  ishCoding()..**.
16440 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e  ** If iDb<0 then
16450 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74   code the OP_Got
16460 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73  o only - don't s
16470 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66  et flag to verif
16480 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  y the.** schema 
16490 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73  on any databases
164a0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
164b0 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  sed to position 
164c0 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65  the OP_Goto.** e
164d0 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65  arly in the code
164e0 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77  , before we know
164f0 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   if any database
16500 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20   tables will be 
16510 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
16520 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
16530 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
16540 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
16550 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16560 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d  Vdbe *v;.  int m
16570 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  ask;..  v = sqli
16580 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16590 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
165a0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69   return;  /* Thi
165b0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
165c0 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72  f there was a pr
165d0 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64  ior error */.  d
165e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
165f0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
16600 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20  okieGoto==0 ){. 
16610 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
16620 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  eGoto = sqlite3V
16630 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
16640 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
16650 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
16660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
16670 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
16680 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
16690 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
166a0 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  iDb==1 );.    as
166b0 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a  sert( iDb<32 );.
166c0 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44      mask = 1<<iD
166d0 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72  b;.    if( (pPar
166e0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  se->cookieMask &
166f0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
16700 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
16710 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
16720 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f       pParse->coo
16730 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
16740 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
16750 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
16760 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
16770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
16780 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
16790 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
167a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
167b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
167c0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
167d0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
167e0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
167f0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
16800 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
16810 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16820 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
16830 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
16840 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
16850 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
16860 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
16870 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
16880 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
16890 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
168a0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
168b0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
168c0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
168d0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
168e0 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
168f0 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
16900 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
16910 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
16920 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
16930 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
16940 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
16950 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
16960 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
16970 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
16980 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
16990 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
169a0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
169b0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
169c0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
169d0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
169e0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
169f0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
16a00 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
16a10 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
16a20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
16a30 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
16a40 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
16a50 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79   set..**.** Only
16a60 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e   database iDb an
16a70 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
16a80 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
16a90 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61  table by this ca
16aa0 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30  ll..** If iDb==0
16ab0 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
16ac0 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73  and temp databas
16ad0 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  es are made writ
16ae0 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44  able.   If.** iD
16af0 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74  b==1 then only t
16b00 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
16b10 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
16b20 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65  e.  If iDb>1 the
16b30 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  n the.** specifi
16b40 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ed auxiliary dat
16b50 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65  abase and the te
16b60 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
16b70 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a  made writable..*
16b80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
16b90 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
16ba0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
16bb0 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
16bc0 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  t, int iDb){.  V
16bd0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
16be0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16bf0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
16c00 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43  turn;.  sqlite3C
16c10 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
16c20 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
16c30 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
16c40 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69  k |= 1<<iDb;.  i
16c50 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  f( setStatement 
16c60 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
16c70 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
16c80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16c90 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44  OP_Statement, iD
16ca0 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  b, 0);.  }.  if(
16cb0 20 69 44 62 21 3d 31 20 26 26 20 70 50 61 72 73   iDb!=1 && pPars
16cc0 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  e->db->aDb[1].pB
16cd0 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t!=0 ){.    sqli
16ce0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16cf0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73  ration(pParse, s
16d00 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b  etStatement, 1);
16d10 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
16d20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
16d30 36 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  6./* .** Return 
16d40 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 73 71  the transient sq
16d50 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
16d60 63 74 20 75 73 65 64 20 66 6f 72 20 65 6e 63 6f  ct used for enco
16d70 64 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e 73  ding conversions
16d80 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 20 63  .** during SQL c
16d90 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ompilation..*/.s
16da0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
16db0 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e  lite3GetTransien
16dc0 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 20 2a  tValue(sqlite3 *
16dd0 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d 3e  db){.  if( !db->
16de0 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64 62  pValue ){.    db
16df0 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69 74  ->pValue = sqlit
16e00 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20  e3ValueNew();.  
16e10 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 70  }.  return db->p
16e20 56 61 6c 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Value;.}.#endif.
16e30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
16e40 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
16e50 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
16e60 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
16e70 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
16e80 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
16e90 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
16ea0 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
16eb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
16ec0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
16ed0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43  collationMatch(C
16ee0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49  ollSeq *pColl, I
16ef0 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
16f00 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d   int n = pIndex-
16f10 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b  >keyInfo.nField;
16f20 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20  .  CollSeq **pp 
16f30 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  = pIndex->keyInf
16f40 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65  o.aColl;.  while
16f50 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28  ( n-- ){.    if(
16f60 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65   *pp==pColl ) re
16f70 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b  turn 1;.    pp++
16f80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
16f90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16fa0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
16fb0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
16fc0 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
16fd0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
16fe0 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
16ff0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
17000 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
17010 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
17020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17030 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65  _REINDEX.void re
17040 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
17050 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
17060 2a 70 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a  *pTab, CollSeq *
17070 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20  pColl){.  Index 
17080 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
17090 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
170a0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
170b0 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72  h pTab */..  for
170c0 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
170d0 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
170e0 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
170f0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  xt){.    if( pCo
17100 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
17110 6f 6e 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49  onMatch(pColl,pI
17120 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 73  ndex) ){.      s
17130 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
17140 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
17150 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  , 0, pTab->iDb);
17160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17170 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
17180 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
17190 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
171a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
171b0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
171c0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
171d0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68  all databases wh
171e0 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63  ere the.** indic
171f0 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  es use the colla
17200 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
17210 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d  oll.  If pColl==
17220 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
17230 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  .** all indices 
17240 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23  everywhere..*/.#
17250 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17260 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
17270 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
17280 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17290 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
172a0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172c0 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
172d0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
172e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
172f0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
17300 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
17310 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
17320 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
17330 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
17340 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17350 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17370 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
17380 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
17390 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
173a0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
173b0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
173c0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
173d0 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
173e0 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
173f0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
17400 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  Db++){.    if( p
17410 44 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Db==0 ) continue
17420 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71  ;.      for(k=sq
17430 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
17440 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  Db->tblHash);  k
17450 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
17460 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
17470 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
17480 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
17490 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
174a0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
174b0 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   pColl);.    }. 
174c0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
174d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
174e0 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
174f0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
17500 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
17530 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
17540 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
17550 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
17560 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
17570 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
17580 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
17590 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
175a0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
175b0 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
175c0 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
175d0 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
175e0 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
175f0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
17600 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
17610 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
17620 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
17630 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
17640 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
17650 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
17660 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
17670 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
17680 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
17690 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
176a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
176b0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
176c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
176d0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
176e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
176f0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
17700 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
17710 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
17720 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
17730 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
17740 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
17750 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
17760 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
17770 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
177a0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
177b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
177c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
177d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
177e0 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
177f0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
17800 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
17810 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
17820 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
17830 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
17840 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
17850 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
17860 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
17870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17880 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
17890 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
178a0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
178b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
178c0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
178d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
178e0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
178f0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
17900 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
17910 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
17920 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
17930 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
17940 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
17950 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
17960 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
17970 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
17980 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
17990 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
179a0 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
179b0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
179c0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
179d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
179e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
179f0 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d  e1==0 || pName1-
17a00 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  >z==0 ){.    rei
17a10 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
17a20 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
17a30 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
17a40 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70  ( pName2==0 || p
17a50 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
17a60 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
17a70 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
17a80 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65  , db->enc, pName
17a90 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c  1->z, pName1->n,
17aa0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
17ab0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
17ac0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
17ad0 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  rse, pColl);.   
17ae0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
17af0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
17b00 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
17b10 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
17b20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
17b30 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
17b40 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
17b50 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17b60 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a  oken(pObjName);.
17b70 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
17b80 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
17b90 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
17ba0 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
17bb0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
17bc0 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
17bd0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
17be0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
17bf0 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(z);.    retur
17c00 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
17c10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
17c20 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
17c30 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
17c40 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
17c50 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
17c60 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
17c70 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
17c80 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
17c90 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
17ca0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
17cb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
17cc0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17cd0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
17ce0 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
17cf0 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
17d00 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
17d10 66 0a                                            f.