/ Hex Artifact Content
Login

Artifact 6d1687c66138af18e210981465ee342fe36985d3:


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 32 37 36 20 32 30 30 34 2f 31 31 2f 31 32  1.276 2004/11/12
02f0: 20 30 33 3a 35 36 3a 31 35 20 64 72 68 20 45 78   03:56:15 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20  rsed.  Check to 
0390: 73 65 65 20 69 66 20 74 68 65 20 73 63 68 65 6d  see if the schem
03a0: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
03b0: 73 65 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  se needs.** to b
03c0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
03d0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e  SQLITE_MASTER an
03e0: 64 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41  d SQLITE_TEMP_MA
03f0: 53 54 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20  STER tables..** 
0400: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
0410: 20 72 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69   read it..*/.voi
0420: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
0430: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
0440: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
0450: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0460: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0470: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0480: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
04a0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
04b0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
04c0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04d0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
04e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
04f0: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
0500: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0510: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
0520: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
0530: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
0540: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
0550: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0560: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0570: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0580: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0590: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
05a0: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
05b0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
05c0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
05d0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
05e0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
05f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0600: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
0610: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0620: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
0630: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
0640: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
0650: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0660: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0670: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a  sted ) return;..
0680: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
0690: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
06a0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
06b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
06c0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
06d0: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
06e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
06f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0700: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
0710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
0720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
0730: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
0740: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
0750: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0760: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0770: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
0780: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
0790: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
07a0: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
07b0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
07c0: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
07d0: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
07e0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
07f0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
0800: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
0810: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0820: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
0830: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
0840: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
0850: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0860: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0870: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
0880: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
0890: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
08a0: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
08b0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
08c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
08d0: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
08e0: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
08f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
0900: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
0910: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
0920: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
0930: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
0940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
0950: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0960: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
0980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0990: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
09a0: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
09b0: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
09c0: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
09d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
09e0: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
09f0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
0a00: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
0a10: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
0a40: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
0a50: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a60: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a70: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0a80: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0a90: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0aa0: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0ab0: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0ac0: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0ad0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0ae0: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0af0: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0b00: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0b10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0b20: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0b30: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0b40: 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c 69  ce() functionali
0b50: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ty..    */.    s
0b60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
0b70: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
0b80: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50  pParse->zSql, pP
0b90: 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72  arse->zTail-pPar
0ba0: 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a  se->zSql);.  }..
0bb0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44  .  /* Get the VD
0bc0: 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79  BE program ready
0bd0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20   for execution. 
0be0: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70   */.  if( v && p
0bf0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
0c00: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
0c10: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0c20: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0c30: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0c40: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   0;.    sqlite3V
0c50: 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63  dbeTrace(v, trac
0c60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
0c70: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
0c80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
0c90: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20  arse->nMem+3,.  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
0cc0: 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65  Tab+3, pParse->e
0cd0: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
0ce0: 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65  rse->rc = pParse
0cf0: 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f  ->nErr ? SQLITE_
0d00: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
0d10: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
0d20: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
0d30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
0d40: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
0d50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
0d60: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
0d70: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
0d80: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
0d90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
0da0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
0db0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0dc0: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
0dd0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
0de0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
0df0: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  sk = 0;.  pParse
0e00: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30  ->cookieGoto = 0
0e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74  ;.}../*.** Run t
0e20: 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f  he parser and co
0e30: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63  de generator rec
0e40: 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65  ursively in orde
0e50: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a  r to generate.**
0e60: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51   code for the SQ
0e70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  L statement give
0e80: 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  n onto the end o
0e90: 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e  f the pParse con
0ea0: 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  text.** currentl
0eb0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
0ec0: 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20  tion.  When the 
0ed0: 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65  parser is run re
0ee0: 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69  cursively.** thi
0ef0: 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c  s way, the final
0f00: 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20   OP_Halt is not 
0f10: 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68  appended and oth
0f20: 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  er initializatio
0f30: 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a  n.** and finaliz
0f40: 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20  ation steps are 
0f50: 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20  omitted because 
0f60: 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69  those are handli
0f70: 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74  ng by the.** out
0f80: 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a  ermost parser..*
0f90: 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68  *.** Not everyth
0fa0: 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e  ing is nestable.
0fb0: 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20    This facility 
0fc0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
0fd0: 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c  ermit.** INSERT,
0fe0: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
0ff0: 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ETE operations a
1000: 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41  gainst SQLITE_MA
1010: 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61  STER.  Use.** ca
1020: 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65  re if you decide
1030: 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74   to try to use t
1040: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  his routine for 
1050: 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1060: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
1070: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
10a0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
10b0: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
10c0: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zSql;.  int rc;.
10d0: 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a  # define SAVE_SZ
10e0: 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29    (sizeof(Parse)
10f0: 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73   - offsetof(Pars
1100: 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20  e,nVar)).  char 
1110: 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d  saveBuf[SAVE_SZ]
1120: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
1130: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1140: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1150: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
1160: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
1170: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
1180: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
1190: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
11a0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
11b0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
11c0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
11d0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70 50  va_end(ap);.  pP
11e0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
11f0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1200: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1210: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1220: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1230: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1240: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
1250: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1260: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
1270: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
1280: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
1290: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
12a0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
12b0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
12c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
12d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
12e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
12f0: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1300: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1310: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1320: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1330: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1340: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1350: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1360: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1370: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1380: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1390: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
13a0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
13b0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
13c0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
13d0: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
13e0: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
13f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1400: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1410: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1420: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1430: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1440: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1450: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1460: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
1470: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
1480: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
1490: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
14a0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
14b0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14c0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
14d0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
14e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
14f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1500: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1510: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1520: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1530: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1540: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1550: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1560: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
1570: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
1580: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1590: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
15a0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
15b0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
15c0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
15d0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
15e0: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
15f0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
1600: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
1610: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1620: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1630: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1640: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1650: 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .tblHash, zName,
1660: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1670: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1680: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1690: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
16a0: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
16b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
16c0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
16d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
16e0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
16f0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1700: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1710: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1720: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1730: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1740: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1750: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1760: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
1770: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
1780: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
1790: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
17a0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
17b0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
17c0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
17d0: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
17e0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
17f0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
1800: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1810: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
1820: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
1830: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
1840: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
1850: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
1860: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1870: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1880: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1890: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
18a0: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
18b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
18c0: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
18d0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
18e0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
18f0: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
1900: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1910: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
1920: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1930: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1940: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
1950: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
1960: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1970: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
1980: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
1990: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
19a0: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
19b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
19d0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
19e0: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
19f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1a00: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1a10: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1a20: 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
1a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1a40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a50: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
1a60: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
1a70: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
1a80: 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29    zName, zDbase)
1a90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aa0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ab0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1ac0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
1ae0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1af0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
1b00: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1b10: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1b20: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1b30: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1b40: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
1b50: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
1b60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1b70: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
1b80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
1b90: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
1ba0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
1bb0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1bc0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1bd0: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1be0: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1bf0: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1c00: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
1c10: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
1c20: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
1c30: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1c40: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
1c50: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
1c60: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1c70: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1c80: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
1c90: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
1ca0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
1cb0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1cc0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
1cd0: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1ce0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
1cf0: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
1d00: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1d10: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1d20: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
1d30: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
1d40: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28  t i;.  assert( (
1d50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1d60: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
1d70: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
1d80: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1d90: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1da0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
1db0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
1dc0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
1dd0: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
1de0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
1df0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
1e00: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1e10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e20: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1e30: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1e40: 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .idxHash, zName,
1e50: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1e60: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1e70: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1e80: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1e90: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
1ea0: 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  y used by an ind
1eb0: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
1ec0: 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65  d freeIndex(Inde
1ed0: 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 46  x *p){.  sqliteF
1ee0: 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  ree(p->zColAff);
1ef0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
1f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
1f10: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
1f20: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1f30: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
1f40: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1f50: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
1f60: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
1f70: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1f80: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1f90: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
1fa0: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
1fb0: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1fc0: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
1fd0: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
1fe0: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
1ff0: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
2000: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2010: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2020: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
2030: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2040: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  b, Index *p){.  
2050: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20  Index *pOld;..  
2060: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26  assert( db!=0 &&
2070: 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a   p->zName!=0 );.
2080: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
2090: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
20a0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48  aDb[p->iDb].idxH
20b0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20  ash, p->zName,. 
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28           strlen(
20e0: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
20f0: 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26  .  if( pOld!=0 &
2100: 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20  & pOld!=p ){.   
2110: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2120: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
2130: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c  Db].idxHash, pOl
2140: 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  d->zName,.      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2160: 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d  trlen(pOld->zNam
2170: 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d  e)+1, pOld);.  }
2180: 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b  .  freeIndex(p);
2190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
21a0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
21b0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
21c0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
21d0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
21e0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
21f0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
2200: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
2210: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
2220: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2230: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
2240: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
2250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2260: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
2270: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
2280: 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72  en;..  len = str
2290: 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  len(zIdxName);. 
22a0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
22b0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
22c0: 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61 73  >aDb[iDb].idxHas
22d0: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e  h, zIdxName, len
22e0: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  +1, 0);.  if( pI
22f0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2300: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2310: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2320: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2330: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2340: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2360: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2370: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2380: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2390: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
23a0: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
23b0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
23c0: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
23d0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
23e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
23f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2400: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
2410: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
2420: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
2430: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
2440: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2450: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
2460: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2470: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
2480: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
2490: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
24a0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
24b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
24c0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
24d0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
24e0: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
24f0: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
2500: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
2510: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
2520: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
2530: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2540: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
2550: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
2560: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
2570: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
2580: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
2590: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
25a0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
25b0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
25c0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
25d0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
25e0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
25f0: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
2600: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
2610: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
2620: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2630: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
2640: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
2650: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
2660: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
2670: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
2680: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
2690: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
26a0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
26b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
26c0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
26d0: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
26e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
26f0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
2700: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2710: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
2720: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
2730: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
2740: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2750: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
2760: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2770: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
2780: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2790: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
27a0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
27b0: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
27c0: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
27d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
27e0: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
27f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2800: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2820: 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72 69  leteTrigger((Tri
2830: 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73 68  gger*)sqliteHash
2840: 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20  Data(pElem));.  
2850: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2860: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
2870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
2880: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
2890: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
28a0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
28b0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
28c0: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
28d0: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
28e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
28f0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
2900: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
2910: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2920: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
2930: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
2940: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
2950: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2960: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
2970: 70 44 62 2d 3e 70 53 65 71 54 61 62 20 3d 20 30  pDb->pSeqTab = 0
2980: 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  ;.    DbClearPro
2990: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
29a0: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
29b0: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
29c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
29d0: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
29e0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
29f0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2a00: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
2a10: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
2a20: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2a30: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
2a40: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
2a50: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e  then remove then
2a60: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
2a70: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
2a80: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
2a90: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
2aa0: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
2ab0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
2ac0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
2ad0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
2ae0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
2af0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
2b00: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
2b10: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
2b20: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
2b30: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2b40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
2b50: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
2b60: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
2b70: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
2b80: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
2b90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
2ba0: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
2bb0: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
2bc0: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
2bd0: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
2be0: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
2bf0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
2c00: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2c10: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
2c20: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2c30: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
2c40: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
2c50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
2c60: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
2c70: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
2c80: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
2ca0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
2cb0: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
2cc0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
2cd0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
2ce0: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
2cf0: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
2d00: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
2d10: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
2d20: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
2d30: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
2d40: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
2d50: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
2d60: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
2d70: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
2d80: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
2d90: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
2da0: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
2db0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
2dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2dd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2de0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
2df0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
2e00: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
2e10: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
2e20: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
2e30: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
2e40: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
2e50: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2e60: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
2e70: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
2e80: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
2e90: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
2ea0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
2eb0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
2ec0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2ed0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
2ee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
2ef0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2f00: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
2f10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2f20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2f30: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
2f40: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2f50: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
2f60: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
2f70: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
2f80: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
2f90: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2fa0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
2fb0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
2fc0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
2fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fe0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
2ff0: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
3000: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3010: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3020: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3030: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
3040: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e  0, pCol=pTable->
3050: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  aCol; i<pTable->
3060: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
3070: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
3080: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
3090: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
30a0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
30b0: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
30c0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
30d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
30e0: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  ee(pTable->aCol)
30f0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
3100: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
3110: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
3120: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
3130: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
3140: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
3150: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
3160: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
3170: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
3180: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
3190: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
31a0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
31b0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
31c0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
31d0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
31e0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
31f0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
3200: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
3210: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
3220: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
3230: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
3240: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
3250: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
3260: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
3270: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3280: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
3290: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
32a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32b0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
32c0: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
32d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
32e0: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
32f0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
3300: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
3310: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
3320: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
3330: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
3340: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
3350: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
3360: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
3370: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
3380: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
3390: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
33a0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
33b0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
33c0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64   *pTable){.  Ind
33d0: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
33e0: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
33f0: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a  y, *pNextFKey;..
3400: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3410: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
3420: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3430: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3440: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3450: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3460: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
3470: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
3480: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
3490: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
34a0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
34b0: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61  pIndex->iDb==pTa
34c0: 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61  ble->iDb || (pTa
34d0: 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70  ble->iDb==0 && p
34e0: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29  Index->iDb==1) )
34f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3500: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
3510: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
3520: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
3530: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3540: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
3550: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
3560: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
3570: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
3580: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
3590: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
35a0: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
35b0: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
35c0: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
35d0: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
35e0: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
35f0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
3600: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
3610: 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ->iDb<db->nDb );
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
3630: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
3640: 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44  ->aDb[pTable->iD
3650: 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20  b].aFKey,.      
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
3680: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
3690: 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b  To)+1)!=pFKey );
36a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
36b0: 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pFKey);.  }..  /
36c0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
36d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
36e0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
36f0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
3700: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
3710: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3720: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
3730: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43  eFree(pTable->zC
3740: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3750: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  3SelectDelete(pT
3760: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
3770: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3780: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ble);.}../*.** U
3790: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
37a0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
37b0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
37c0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
37d0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
37e0: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
37f0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
3800: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
3810: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3820: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
3830: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3840: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
3850: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
3860: 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31   *p;.  FKey *pF1
3870: 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44  , *pF2;.  Db *pD
3880: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
3890: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
38a0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
38b0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
38c0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  rt( zTabName && 
38d0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20  zTabName[0] );. 
38e0: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
38f0: 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  iDb];.  p = sqli
3900: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
3910: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  Db->tblHash, zTa
3920: 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54  bName, strlen(zT
3930: 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  abName)+1, 0);. 
3940: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f   if( p ){.    fo
3950: 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20  r(pF1=p->pFKey; 
3960: 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e  pF1; pF1=pF1->pN
3970: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
3980: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
3990: 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  (pF1->zTo) + 1;.
39a0: 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69        pF2 = sqli
39b0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62  te3HashFind(&pDb
39c0: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
39d0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69  o, nTo);.      i
39e0: 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20  f( pF2==pF1 ){. 
39f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
3a00: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61  shInsert(&pDb->a
3a10: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
3a20: 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54  nTo, pF1->pNextT
3a30: 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
3a40: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
3a50: 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78  pF2 && pF2->pNex
3a60: 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d  tTo!=pF1 ){ pF2=
3a70: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a  pF2->pNextTo; }.
3a80: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 32 20          if( pF2 
3a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 32  ){.          pF2
3aa0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d  ->pNextTo = pF1-
3ab0: 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20  >pNextTo;.      
3ac0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3ad0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  }.    sqlite3Del
3ae0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
3af0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3b00: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3b10: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3b20: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
3b30: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
3b40: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
3b50: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
3b60: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74  hat.** token wit
3b70: 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73  h any quotations
3b80: 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65   removed.  Space
3b90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
3ba0: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
3bb0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
3bc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
3bd0: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
3be0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
3bf0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
3c00: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 72  .** Tokens are r
3c10: 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74  eally just point
3c20: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
3c30: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
3c40: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
3c50: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3c60: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
3c70: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
3c80: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
3c90: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
3ca0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
3cb0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
3cc0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
3cd0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
3ce0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
3cf0: 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  e;.  if( pName )
3d00: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
3d10: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
3d20: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
3d30: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
3d40: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
3d50: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
3d60: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3d70: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
3d80: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
3d90: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
3da0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
3db0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
3dc0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
3dd0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
3de0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
3df0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
3e00: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56  penMasterTable(V
3e10: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29  dbe *v, int iDb)
3e20: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
3e30: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
3e40: 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73  er, iDb, 0);.  s
3e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3e60: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
3e70: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29   0, MASTER_ROOT)
3e80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3e90: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
3ea0: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b  mColumns, 0, 5);
3eb0: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
3ec0: 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20  r has 5 columns 
3ed0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  */.}../*.** The 
3ee0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
3ef0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
3f00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
3f10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
3f20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
3f30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
3f40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
3f50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
3f60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
3f70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
3f80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
3f90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
3fa0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
3fb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
3fc0: 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  findDb(sqlite3 *
3fd0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
3fe0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 44 62  ){.  int i;.  Db
3ff0: 20 2a 70 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *pDb;.  char *z
4000: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4010: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4020: 65 29 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  e);.  int n = st
4030: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  rlen(zName);.  f
4040: 6f 72 28 70 44 62 3d 64 62 2d 3e 61 44 62 2c 20  or(pDb=db->aDb, 
4050: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
4060: 69 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  i++, pDb++){.   
4070: 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65 6e 28 70   if( n==strlen(p
4080: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 30 3d  Db->zName) && 0=
4090: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
40a0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
40b0: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
40c0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
40d0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
40e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
40f0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4100: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
4110: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
4120: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
4130: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
4140: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4150: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
4160: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
4170: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4180: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
4190: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
41a0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
41b0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
41c0: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
41d0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
41e0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
41f0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
4200: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
4210: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4220: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4230: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
4240: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4250: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
4260: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4270: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
4280: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
4290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
42a0: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
42b0: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
42c0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
42d0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
42e0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
42f0: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4300: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4310: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
4320: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
4330: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
4340: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4350: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
4360: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4370: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4380: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4390: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
43a0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
43b0: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
43c0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
43d0: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
43e0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
43f0: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
4400: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
4410: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
4420: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
4430: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
4440: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
4450: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
4460: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
4490: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
44a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
44b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
44c0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26  .  if( pName2 &&
44d0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
44e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
44f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
4500: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
4510: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 66  me2;.    iDb = f
4520: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4530: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4540: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4550: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4560: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4570: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4580: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4590: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
45a0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
45b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
45c0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
45d0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
45e0: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
45f0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
4600: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4610: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
4620: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
4630: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4640: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
4650: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
4660: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4670: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4680: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
4690: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
46a0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
46b0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
46c0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
46d0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
46e0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
46f0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
4700: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
4710: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
4720: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
4730: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
4740: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
4750: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
4760: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
4770: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
4780: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
4790: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
47a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
47b0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
47c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
47d0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
47e0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30   .          && 0
47f0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
4800: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
4810: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
4820: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4830: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
4840: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
4850: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
4860: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
4870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
4880: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
4890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
48a0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
48b0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
48c0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
48d0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
48e0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
48f0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
4900: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
4910: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
4920: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
4930: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4940: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
4950: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
4960: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4970: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
4980: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
4990: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
49a0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
49b0: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
49c0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
49d0: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
49e0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
49f0: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
4a00: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
4a10: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
4a20: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
4a30: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
4a40: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
4a50: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
4a60: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
4a70: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
4a80: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
4a90: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
4aa0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
4ab0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
4ac0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
4ad0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
4ae0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
4af0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
4b00: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
4b10: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
4b20: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
4b30: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
4b40: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4b50: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
4b60: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
4b70: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
4b80: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
4b90: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
4ba0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
4bb0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
4bc0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
4bd0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
4be0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
4bf0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
4c00: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
4c10: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
4c20: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
4c30: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
4c40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
4c50: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
4c60: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
4c70: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4c80: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
4c90: 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45  t,   /* The "CRE
4ca0: 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ATE" token */.  
4cb0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4cc0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
4cd0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
4ce0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
4cf0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4d00: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
4d10: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
4d20: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
4d30: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
4d40: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
4d50: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
4d60: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
4d70: 20 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20   int isView     
4d80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
4d90: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29  s is a VIEW */.)
4da0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
4db0: 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  e;.  Index *pIdx
4dc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
4dd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4de0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
4df0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
4e00: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
4e10: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f  tabase number to
4e20: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
4e30: 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  e in */.  Token 
4e40: 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e  *pName;    /* Un
4e50: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
4e60: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63  f the table to c
4e70: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  reate */..  /* T
4e80: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4e90: 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20   name to create 
4ea0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
4eb0: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
4ec0: 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31  kens.  ** pName1
4ed0: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4ee0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4ef0: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4f00: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4f10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
4f20: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
4f30: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a  (...);.  ** .  *
4f40: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4f50: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
4f60: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
4f70: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4f80: 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61  d if.  ** the ta
4f90: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4fa0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4fb0: 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   i.e.:.  **.  **
4fc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
4fd0: 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a  y(...);.  **.  *
4fe0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4ff0: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
5000: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
5010: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61    **.  ** The ca
5020: 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68  ll below sets th
5030: 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20  e pName pointer 
5040: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5050: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5060: 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  .  ** pName2) th
5070: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
5080: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
5090: 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62  name. The variab
50a0: 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73  le iDb is.  ** s
50b0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
50c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
50d0: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f  that the table o
50e0: 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a  r view is to be.
50f0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e    ** created in.
5100: 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
5110: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
5120: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
5130: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
5140: 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
5150: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 69 73  return;.  if( is
5160: 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b  Temp && iDb>1 ){
5170: 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74  .    /* If creat
5180: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
5190: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
51a0: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20  ot be qualified 
51b0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
51c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
51d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
51e0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
51f0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
5200: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5220: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
5230: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5240: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5250: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5260: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5270: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
5280: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
5290: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
52a0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
52b0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
52c0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
52d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
52e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
52f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  urn;.  }.  if( d
5300: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
5310: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
5320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5330: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
5340: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
5350: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
5360: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
5370: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
5380: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
5390: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
53a0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
53b0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
53c0: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
53d0: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
53e0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  zDb) ){.      sq
53f0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
5400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
5410: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5420: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5430: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5440: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5450: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5460: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
5470: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5480: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
5490: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
54a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
54b0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
54c0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
54d0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
54e0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
54f0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5500: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
5510: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
5520: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5530: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5540: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5550: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5560: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
5570: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
5580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
5590: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
55a0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
55b0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
55c0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
55d0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
55e0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
55f0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
5600: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
5610: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
5620: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a  f.  ** it does..
5630: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
5640: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
5650: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
5660: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62  ) return;.  pTab
5670: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
5680: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
5690: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
56a0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
56b0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
56c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
56d0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
56e0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
56f0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
5700: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
5710: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
5720: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
5730: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
5740: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 20  Name, 0))!=0 && 
5750: 0a 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30 20  .      ( iDb==0 
5760: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
5770: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
5780: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5790: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
57a0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
57b0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
57c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
57d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
57e0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  n;.  }.  pTable 
57f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5800: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
5810: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
5820: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
5830: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5840: 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  M;.    pParse->n
5850: 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Err++;.    sqlit
5860: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
5870: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5880: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
5890: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
58a0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
58b0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
58c0: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
58d0: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
58e0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
58f0: 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  ble->iDb = iDb;.
5900: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
5910: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
5920: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
5930: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5940: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
5950: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
5960: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
5970: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
5980: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
5990: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
59a0: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
59b0: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
59c0: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
59d0: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
59e0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
59f0: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
5a00: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
5a10: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
5a20: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
5a40: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 73  NCREMENT.  if( s
5a50: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
5a60: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
5a70: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44  =0 ){.    db->aD
5a80: 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20 3d  b[iDb].pSeqTab =
5a90: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
5aa0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
5ab0: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
5ac0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
5ad0: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
5ae0: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
5af0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
5b00: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
5b10: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
5b20: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
5b30: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
5b40: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
5b50: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
5b60: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
5b70: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
5b80: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
5b90: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
5ba0: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
5bb0: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
5bc0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
5bd0: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
5be0: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
5bf0: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
5c00: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
5c10: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
5c20: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
5c30: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
5c40: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
5c50: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
5c60: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
5c70: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
5c80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5c90: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
5ca0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
5cb0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5cc0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
5cd0: 20 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d      /* Every tim
5ce0: 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73  e a new table is
5cf0: 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 6c   created the fil
5d00: 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  e-format.    ** 
5d10: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74  and encoding met
5d20: 61 2d 76 61 6c 75 65 73 20 61 72 65 20 73 65 74  a-values are set
5d30: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5d40: 2c 20 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65  , in.    ** case
5d50: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
5d60: 73 74 20 74 61 62 6c 65 20 63 72 65 61 74 65 64  st table created
5d70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5d80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5d90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
5da0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
5db0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5dc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5dd0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
5de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5df0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
5e00: 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29  ger, db->enc, 0)
5e10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5e30: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b  Cookie, iDb, 4);
5e40: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
5e50: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
5e60: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
5e70: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
5e80: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
5e90: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
5ea0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
5eb0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
5ec0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
5ed0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
5ee0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
5ef0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
5f00: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
5f10: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
5f20: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
5f30: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
5f40: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
5f50: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
5f60: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
5f70: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
5f80: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
5f90: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
5fa0: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
5fb0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
5fc0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5fd0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
5fe0: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  (v, iDb);.    sq
5ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6000: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
6010: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6020: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6030: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
6060: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6070: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6080: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
6090: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
60a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
60b0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
60c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
60d0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
60e0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
60f0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
6100: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
6110: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
6120: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
6130: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
6140: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
6150: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6160: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
6170: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
6180: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
6190: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
61a0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
61b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
61c0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
61d0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
61e0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
61f0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
6200: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
6210: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6220: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
6230: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6240: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6250: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6260: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
6270: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6280: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
6290: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
62a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
62b0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
62c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
62d0: 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43  StrICmp(z, p->aC
62e0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[i].zName)==0 
62f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6300: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6310: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
6320: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
6330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
6340: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  ee(z);.      ret
6350: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
6360: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
6370: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
6380: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
6390: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   aNew = sqliteRe
63a0: 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20  alloc( p->aCol, 
63b0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
63c0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
63d0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
63e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
63f0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
6400: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
6410: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
6420: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
6430: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
6440: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
6450: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
6460: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
6470: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
6480: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
6490: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
64a0: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
64b0: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
64c0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
64d0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
64e0: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
64f0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
6500: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
6510: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
6520: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
6530: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
6540: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f  _AFF_NONE;.  pCo
6550: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
6560: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
6570: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
6580: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6590: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
65a0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
65b0: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
65c0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
65d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
65e0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
65f0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
6600: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
6610: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
6620: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
6630: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
6640: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
6650: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
6660: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6670: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6680: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
6690: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
66a0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
66b0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
66c0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
66d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
66e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
66f0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
6700: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
6710: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
6720: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rror;.}../*.** T
6730: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6740: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
6750: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
6760: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
6770: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
6780: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6790: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
67a0: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
67b0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
67c0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
67d0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
67e0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
67f0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
6800: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
6810: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
6820: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
6830: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
6840: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
6850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
6860: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
6870: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
6880: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
6890: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
68a0: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
68b0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
68c0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
68d0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
68e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
68f0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
6900: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
6910: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
6920: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
6930: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
6940: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6950: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6960: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6970: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
6980: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
6990: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
69a0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
69b0: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
69c0: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
69d0: 4c 61 73 74 2d 3e 6e 20 2b 20 28 70 4c 61 73 74  Last->n + (pLast
69e0: 2d 3e 7a 20 2d 20 70 46 69 72 73 74 2d 3e 7a 29  ->z - pFirst->z)
69f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
6a00: 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ->zType==0 );.  
6a10: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  z = pCol->zType 
6a20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
6a30: 28 22 25 2e 2a 73 22 2c 20 6e 2c 20 70 46 69 72  ("%.*s", n, pFir
6a40: 73 74 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 7a 3d  st->z);.  if( z=
6a50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
6a60: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
6a70: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
6a80: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
6a90: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
6aa0: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
6ab0: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
6ac0: 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61  ] = 0;.  pCol->a
6ad0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
6ae0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c  3AffinityType(z,
6af0: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   n);.}../*.** Th
6b00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6b10: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
6b20: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
6b30: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
6b40: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
6b50: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
6b60: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6b70: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
6b80: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
6b90: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
6ba0: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
6bb0: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
6bc0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
6bd0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
6be0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6bf0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
6c00: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
6c10: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
6c20: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
6c30: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
6c40: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
6c50: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
6c60: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
6c70: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
6c80: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
6c90: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
6ca0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6cb0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
6cc0: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
6cd0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
6ce0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
6cf0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
6d00: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
6d10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6d20: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
6d30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
6d40: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
6d50: 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e  ,.        pCol->
6d60: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
6d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6d80: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
6d90: 6c 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70  lt);.    pCol->p
6da0: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
6db0: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
6dc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
6dd0: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
6de0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
6df0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6e00: 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pExpr);.}../*.*
6e10: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
6e20: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
6e30: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
6e40: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
6e50: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
6e60: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
6e70: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
6e80: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
6e90: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
6ea0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
6eb0: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
6ec0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
6ed0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
6ee0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
6ef0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
6f00: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
6f10: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
6f20: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
6f30: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
6f40: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
6f50: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
6f60: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
6f70: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
6f80: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
6f90: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
6fa0: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
6fb0: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
6fc0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
6fd0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
6fe0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69  umn as the row i
6ff0: 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a  d.  (Exception:.
7000: 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  ** For backwards
7010: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
7020: 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61  ith older databa
7030: 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  ses, do not do t
7040: 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  his.** if the fi
7050: 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f  le format versio
7060: 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  n number is less
7070: 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74   than 1.)  Set t
7080: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
7090: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
70a0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
70b0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
70c0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
70d0: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
70e0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
70f0: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
7100: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
7110: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
7120: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
7130: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
7140: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
7150: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
7160: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
7170: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
7180: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
7190: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
71a0: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
71b0: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
71c0: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
71d0: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
71e0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
71f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
7210: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
7220: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
7230: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
7240: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
7250: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
7260: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
7270: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
7280: 6e 74 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20  nt autoInc      
7290: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
72a0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
72b0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
72c0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
72d0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
72e0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
72f0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
7300: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
7310: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
7320: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
7330: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
7340: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
7350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7360: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
7370: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
7380: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
7390: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
73a0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
73b0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
73c0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
73d0: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
73e0: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
73f0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
7400: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
7410: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
7420: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
7430: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
7440: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7450: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
7460: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
7470: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
7480: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
7490: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
74a0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
74b0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
74c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
74d0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
74e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
74f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7500: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
7510: 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62  Tab->nCol ) pTab
7520: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
7530: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  rimKey = 1;.    
7540: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
7550: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
7560: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
7570: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7580: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
7590: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
75a0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
75b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
75c0: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
75d0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
75e0: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
75f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
7600: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
7610: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
7620: 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49  .    pTab->autoI
7630: 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20  nc = autoInc;.  
7640: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
7650: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
7660: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
7670: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
7680: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7690: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
76a0: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
76b0: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
76c0: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
76d0: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
76e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
76f0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
7700: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
7710: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
7720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
7730: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
7740: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
7750: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7760: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
7770: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
7780: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
7790: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
77a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
77b0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
77c0: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
77d0: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
77e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
77f0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
7800: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
7810: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
7820: 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  t nType){.  Tabl
7830: 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70  e *p;.  Index *p
7840: 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Idx;.  CollSeq *
7850: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
7860: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7870: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7880: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
7890: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
78a0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
78b0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
78c0: 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  rse, zType, nTyp
78d0: 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e);.  p->aCol[i]
78e0: 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  .pColl = pColl;.
78f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c  .  /* If the col
7900: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
7910: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
7920: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
7930: 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65  type>",.  ** the
7940: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
7950: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
7960: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
7970: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20  before the.  ** 
7980: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
7990: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
79a0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
79b0: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
79c0: 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70   for(pIdx = p->p
79d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
79e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
79f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
7a00: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
7a10: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
7a20: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70  Column[0]==i ) p
7a30: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
7a40: 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[0] = pColl;. 
7a50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
7a60: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  te and return an
7a70: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
7a80: 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  db.aCollSeq hash
7a90: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65   table. If the e
7aa0: 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65  ntry.** specifie
7ab0: 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e  d by zName and n
7ac0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e  Name is not foun
7ad0: 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  d and parameter 
7ae0: 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74  'create' is.** t
7af0: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
7b00: 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74   a new entry. Ot
7b10: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e  herwise return N
7b20: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ULL..**.** Each 
7b30: 70 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69  pointer stored i
7b40: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43  n the sqlite3.aC
7b50: 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c  ollSeq hash tabl
7b60: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a  e contains an.**
7b70: 20 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20   array of three 
7b80: 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72  CollSeq structur
7b90: 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73  es. The first is
7ba0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7bb0: 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66  equence.** preff
7bc0: 65 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  erred for UTF-8,
7bd0: 20 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d   the second UTF-
7be0: 31 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68  16le, and the th
7bf0: 69 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a  ird UTF-16be..**
7c00: 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64  .** Stored immed
7c10: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
7c20: 20 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e   three collation
7c30: 20 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20   sequences is a 
7c40: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63  copy of.** the c
7c50: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7c60: 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65  e name. A pointe
7c70: 72 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67  r to this string
7c80: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
7c90: 20 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   each collation 
7ca0: 73 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75  sequence structu
7cb0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  re..*/.static Co
7cc0: 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c  llSeq * findColl
7cd0: 53 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69  SeqEntry(.  sqli
7ce0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
7cf0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
7d00: 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  int nName,.  int
7d10: 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c   create.){.  Col
7d20: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
7d30: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61  f( nName<0 ) nNa
7d40: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
7d50: 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  e);.  pColl = sq
7d60: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
7d70: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
7d80: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69  me, nName);..  i
7d90: 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63  f( 0==pColl && c
7da0: 72 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  reate ){.    pCo
7db0: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
7dc0: 63 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f  c( 3*sizeof(*pCo
7dd0: 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20  ll) + nName + 1 
7de0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
7df0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b   ){.      pColl[
7e00: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  0].zName = (char
7e10: 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20  *)&pColl[3];.   
7e20: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20     pColl[0].enc 
7e30: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
7e40: 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e       pColl[1].zN
7e50: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ame = (char*)&pC
7e60: 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43  oll[3];.      pC
7e70: 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c  oll[1].enc = SQL
7e80: 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20  ITE_UTF16LE;.   
7e90: 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d     pColl[2].zNam
7ea0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7eb0: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7ec0: 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[2].enc = SQLIT
7ed0: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20  E_UTF16BE;.     
7ee0: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d   memcpy(pColl[0]
7ef0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  .zName, zName, n
7f00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
7f10: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ll[0].zName[nNam
7f20: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  e] = 0;.      sq
7f30: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
7f40: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70  &db->aCollSeq, p
7f50: 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e  Coll[0].zName, n
7f60: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  Name, pColl);.  
7f70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7f80: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
7f90: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
7fa0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46   points to a UTF
7fb0: 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
7fc0: 67 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f  g nName bytes lo
7fd0: 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ng..** Return th
7fe0: 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74  e CollSeq* point
7ff0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61  er for the colla
8000: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
8010: 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72  med zName.** for
8020: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65   the encoding 'e
8030: 6e 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74  nc' from the dat
8040: 61 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a  abase 'db'..**.*
8050: 2a 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73  * If the entry s
8060: 70 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20  pecified is not 
8070: 66 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74  found and 'creat
8080: 65 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  e' is true, then
8090: 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77   create a.** new
80a0: 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69   entry.  Otherwi
80b0: 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  se return NULL..
80c0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
80d0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a  te3FindCollSeq(.
80e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
80f0: 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74   u8 enc,.  const
8100: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
8110: 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  int nName,.  int
8120: 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c   create.){.  Col
8130: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69  lSeq *pColl = fi
8140: 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64  ndCollSeqEntry(d
8150: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
8160: 20 63 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65   create);.  asse
8170: 72 74 28 20 53 51 4c 49 54 45 5f 55 54 46 38 3d  rt( SQLITE_UTF8=
8180: 3d 31 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46  =1 && SQLITE_UTF
8190: 31 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49 54  16LE==2 && SQLIT
81a0: 45 5f 55 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a  E_UTF16BE==3 );.
81b0: 20 20 61 73 73 65 72 74 28 20 65 6e 63 3e 3d 53    assert( enc>=S
81c0: 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 65 6e  QLITE_UTF8 && en
81d0: 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c<=SQLITE_UTF16B
81e0: 45 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  E );.  if( pColl
81f0: 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d   ) pColl += enc-
8200: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  1;.  return pCol
8210: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  l;.}../*.** Invo
8220: 6b 65 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f  ke the 'collatio
8230: 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61  n needed' callba
8240: 63 6b 20 74 6f 20 72 65 71 75 65 73 74 20 61 20  ck to request a 
8250: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8260: 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  ce.** in the dat
8270: 61 62 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64  abase text encod
8280: 69 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d  ing of name zNam
8290: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
82a0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  .** If the colla
82b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f  tion sequence.*/
82c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c  .static void cal
82d0: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69  lCollNeeded(sqli
82e0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
82f0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
8300: 6e 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74  nName){.  assert
8310: 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  ( !db->xCollNeed
8320: 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c  ed || !db->xColl
8330: 4e 65 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66  Needed16 );.  if
8340: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
8350: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
8360: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f  );.  if( db->xCo
8370: 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  llNeeded ){.    
8380: 63 68 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20  char *zExternal 
8390: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
83a0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
83b0: 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61     if( !zExterna
83c0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
83d0: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28  db->xCollNeeded(
83e0: 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
83f0: 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d  rg, db, (int)db-
8400: 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29  >enc, zExternal)
8410: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8420: 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d  (zExternal);.  }
8430: 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c  .  if( db->xColl
8440: 4e 65 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20  Needed16 ){.    
8450: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74  char const *zExt
8460: 65 72 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74  ernal;.    sqlit
8470: 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d  e3_value *pTmp =
8480: 20 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73   sqlite3GetTrans
8490: 69 65 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20  ientValue(db);. 
84a0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
84b0: 65 74 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20  etStr(pTmp, -1, 
84c0: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
84d0: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
84e0: 43 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61  C);.    zExterna
84f0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
8500: 54 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54  Text(pTmp, SQLIT
8510: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
8520: 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e      if( !zExtern
8530: 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  al ) return;.   
8540: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
8550: 31 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  16(db->pCollNeed
8560: 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29  edArg, db, (int)
8570: 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e  db->enc, zExtern
8580: 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  al);.  }.}../*.*
8590: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
85a0: 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  s called if the 
85b0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
85c0: 79 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76  y fails to deliv
85d0: 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f  er a.** collatio
85e0: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  n function in th
85f0: 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20  e best encoding 
8600: 62 75 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  but there may be
8610: 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a   other versions.
8620: 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61  ** of this colla
8630: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66  tion function (f
8640: 6f 72 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e  or other text en
8650: 63 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62  codings) availab
8660: 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f  le. Use one.** o
8670: 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64 20  f these instead 
8680: 69 66 20 74 68 65 79 20 65 78 69 73 74 2e 20 41  if they exist. A
8690: 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e  void a UTF-8 <->
86a0: 20 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69   UTF-16 conversi
86b0: 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c  on if.** possibl
86c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
86d0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61   synthCollSeq(Pa
86e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
86f0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
8700: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b  CollSeq *pColl2;
8710: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f  .  char *z = pCo
8720: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ll->zName;.  int
8730: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
8740: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8750: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8760: 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
8770: 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20  nst u8 aEnc[] = 
8780: 7b 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  { SQLITE_UTF16BE
8790: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
87a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b  , SQLITE_UTF8 };
87b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b  .  for(i=0; i<3;
87c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c   i++){.    pColl
87d0: 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  2 = sqlite3FindC
87e0: 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e 63 5b  ollSeq(db, aEnc[
87f0: 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  i], z, n, 0);.  
8800: 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43    if( pColl2->xC
8810: 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  mp!=0 ){.      m
8820: 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f  emcpy(pColl, pCo
8830: 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  ll2, sizeof(Coll
8840: 53 65 71 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Seq));.      ret
8850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8860: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
8870: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
8880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8890: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
88a0: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
88b0: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
88c0: 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 70  , n, z);.  }.  p
88d0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
88e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
88f0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
8900: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8910: 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61  alled on a colla
8920: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65  tion sequence be
8930: 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 20  fore it is used 
8940: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74  to.** check that
8950: 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20   it is defined. 
8960: 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c  An undefined col
8970: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8980: 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61  exists when.** a
8990: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61   database is loa
89a0: 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ded that contain
89b0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
89c0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
89d0: 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ces.** that have
89e0: 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65   not been define
89f0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65  d by sqlite3_cre
8a00: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20  ate_collation() 
8a10: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  etc..**.** If re
8a20: 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
8a30: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27  tine calls the '
8a40: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
8a50: 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a  ' callback to.**
8a60: 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69 6e   request a defin
8a70: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ition of the col
8a80: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
8a90: 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74   If this doesn't
8aa0: 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71   work, .** an eq
8ab0: 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69  uivalent collati
8ac0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  ng sequence that
8ad0: 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e 63   uses a text enc
8ae0: 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  oding different.
8af0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ** from the main
8b00: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75 62   database is sub
8b10: 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65  stituted, if one
8b20: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
8b30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
8b40: 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ckCollSeq(Parse 
8b50: 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71  *pParse, CollSeq
8b60: 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20   *pColl){.  if( 
8b70: 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d  pColl && !pColl-
8b80: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20  >xCmp ){.    /* 
8b90: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
8ba0: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
8bb0: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
8bc0: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
8bd0: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
8be0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8bf0: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
8c00: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
8c10: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
8c20: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
8c30: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
8c40: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73   pColl->zName, s
8c50: 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  trlen(pColl->zNa
8c60: 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  me));.    if( !p
8c70: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79  Coll->xCmp && sy
8c80: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
8c90: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
8ca0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8cb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8cc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8cd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
8ce0: 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b  all sqlite3Check
8cf0: 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c  CollSeq() for al
8d00: 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  l collating sequ
8d10: 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65  ences in an inde
8d20: 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  x,.** in order t
8d30: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
8d40: 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  l the necessary 
8d50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8d60: 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65  ces are.** loade
8d70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8d80: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
8d90: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
8da0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
8db0: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
8dc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
8dd0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
8de0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
8df0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68     if( sqlite3Ch
8e00: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
8e10: 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  e, pIdx->keyInfo
8e20: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20  .aColl[i]) ){.  
8e30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8e40: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
8e50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
8e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
8e80: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8e90: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8ea0: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
8eb0: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
8ec0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
8ed0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
8ee0: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
8ef0: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
8f00: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
8f10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8f20: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
8f30: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
8f40: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
8f50: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
8f60: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
8f70: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
8f80: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
8f90: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
8fa0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
8fb0: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
8fc0: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
8fd0: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
8fe0: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
8ff0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
9000: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
9010: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
9020: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
9030: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
9040: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
9050: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
9060: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
9070: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
9080: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
9090: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
90a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
90b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
90c0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
90d0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53  pParse..*/.CollS
90e0: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
90f0: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
9100: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
9110: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
9120: 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20  Name){.  u8 enc 
9130: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
9140: 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  c;.  u8 initbusy
9150: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69   = pParse->db->i
9160: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
9170: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
9180: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9190: 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c  pParse->db, enc,
91a0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
91b0: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
91c0: 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20  nName<0 ) nName 
91d0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
91e0: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
91f0: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
9200: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
9210: 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74      /* No collat
9220: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ion sequence of 
9230: 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68  this type for th
9240: 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72  is encoding is r
9250: 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a  egistered..    *
9260: 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61  * Call the colla
9270: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20  tion factory to 
9280: 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75  see if it can su
9290: 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65  pply us with one
92a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c  ..    */.    cal
92b0: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72  lCollNeeded(pPar
92c0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  se->db, zName, n
92d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  Name);.    pColl
92e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
92f0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62  llSeq(pParse->db
9300: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
9310: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
9320: 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c   pColl && !pColl
9330: 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20  ->xCmp ){.      
9340: 2f 2a 20 54 68 65 72 65 20 6d 61 79 20 62 65 20  /* There may be 
9350: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  a version of the
9360: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9370: 6e 63 65 20 74 68 61 74 20 72 65 71 75 69 72 65  nce that require
9380: 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  s.      ** trans
9390: 6c 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65  lation between e
93a0: 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68  ncodings. Search
93b0: 20 66 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e   for it with syn
93c0: 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20  thCollSeq()..   
93d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
93e0: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61  synthCollSeq(pPa
93f0: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20  rse, pColl) ){. 
9400: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
9410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9420: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68   }..  /* If noth
9430: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75  ing has been fou
9440: 6e 64 2c 20 77 72 69 74 65 20 74 68 65 20 65 72  nd, write the er
9450: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9460: 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28   pParse */.  if(
9470: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9480: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9490: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66  >xCmp) ){.    if
94a0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
94b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
94c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
94d0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
94e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
94f0: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
9500: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
9510: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
9520: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
9530: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  ..../*.** Scan t
9540: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
9550: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
9560: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
9570: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
9580: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
9590: 79 70 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ype..*/.char sql
95a0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
95b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79  (const char *zTy
95c0: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
95d0: 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74    int n, i;.  st
95e0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
95f0: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
9600: 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65  ar *zSub;  /* Ke
9610: 79 77 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67  ywords substring
9620: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
9630: 2f 0a 20 20 20 20 63 68 61 72 20 6e 53 75 62 3b  /.    char nSub;
9640: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67           /* leng
9650: 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20  th of zSub */.  
9660: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
9670: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
9680: 20 74 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74   to return if it
9690: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20   matches */.  } 
96a0: 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b  substrings[] = {
96b0: 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c  .    {"INT",  3,
96c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
96d0: 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52  GER},.    {"CHAR
96e0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
96f0: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c  _TEXT},.    {"CL
9700: 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  OB", 4, SQLITE_A
9710: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
9720: 54 45 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45  TEXT", 4, SQLITE
9730: 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20  _AFF_TEXT},.    
9740: 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49  {"BLOB", 4, SQLI
9750: 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20  TE_AFF_NONE},.  
9760: 7d 3b 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d  };..  if( nType=
9770: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9780: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
9790: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
97a0: 20 69 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72   i<sizeof(substr
97b0: 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62  ings)/sizeof(sub
97c0: 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b  strings[0]); i++
97d0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20  ){.    int c1 = 
97e0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53  substrings[i].zS
97f0: 75 62 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63  ub[0];.    int c
9800: 32 20 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b  2 = tolower(c1);
9810: 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
9820: 20 6e 54 79 70 65 20 2d 20 73 75 62 73 74 72 69   nType - substri
9830: 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20  ngs[i].nSub;.   
9840: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9850: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a   substrings[i].z
9860: 53 75 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Sub;.    for(n=0
9870: 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29  ; n<=limit; n++)
9880: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20  {.      int c = 
9890: 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20  zType[n];.      
98a0: 69 66 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d  if( (c==c1 || c=
98b0: 3d 63 32 29 0a 20 20 20 20 20 20 20 20 20 20 20  =c2).           
98c0: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
98d0: 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e  trNICmp(&zType[n
98e0: 5d 2c 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73  ], z, substrings
98f0: 5b 69 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20  [i].nSub) ){.   
9900: 20 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 73       return subs
9910: 74 72 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69  trings[i].affini
9920: 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ty;.      }.    
9930: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
9940: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9950: 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  C;.}../*.** Gene
9960: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
9970: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
9980: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
9990: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
99a0: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
99b0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
99c0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
99d0: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
99e0: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
99f0: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
9a00: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
9a10: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
9a20: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
9a30: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
9a40: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
9a50: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
9a60: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
9a70: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
9a80: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9a90: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
9aa0: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
9ab0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
9ac0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
9ad0: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
9ae0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
9af0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
9b00: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
9b10: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
9b20: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
9b30: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
9b40: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
9b50: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
9b60: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
9b70: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
9b80: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
9b90: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
9ba0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
9bb0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
9bc0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
9bd0: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
9be0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
9bf0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
9c00: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
9c10: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
9c20: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
9c30: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
9c40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
9c50: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
9c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9c70: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9c80: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
9c90: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
9ca0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
9cb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
9cc0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
9cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
9ce0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
9cf0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
9d00: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
9d10: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
9d20: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
9d30: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9d40: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
9d50: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
9d60: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
9d70: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
9d80: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
9d90: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
9da0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
9db0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
9dc0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
9dd0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9de0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
9df0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9e00: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
9e10: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
9e20: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
9e30: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
9e40: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
9e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9e60: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
9e70: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
9e80: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
9e90: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
9ea0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
9eb0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
9ec0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
9ed0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
9ee0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
9ef0: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
9f00: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
9f10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9f20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
9f30: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
9f40: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
9f50: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
9f60: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
9f70: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
9f80: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
9f90: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
9fa0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
9fb0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
9fc0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
9fd0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9ff0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
a000: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
a010: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
a020: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a030: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
a040: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a050: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
a060: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
a070: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
a080: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
a090: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
a0a0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
a0b0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
a0c0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
a0d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a0e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a0f0: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
a100: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
a110: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
a120: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
a130: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
a140: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
a150: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a160: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
a170: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
a180: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a190: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
a1a0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
a1b0: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a  Stmt(Table *p){.
a1c0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
a1d0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
a1e0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
a1f0: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
a200: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
a210: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
a220: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
a230: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a240: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a250: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
a260: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
a270: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
a280: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
a290: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
a2a0: 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20  len(z) + 1);.   
a2b0: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
a2c0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
a2d0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
a2e0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
a2f0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
a300: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
a310: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
a320: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
a330: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
a340: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
a350: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
a360: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
a370: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
a380: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
a390: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
a3a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
a3b0: 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69  rcpy(zStmt, p->i
a3c0: 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20  Db==1 ? "CREATE 
a3d0: 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22  TEMP TABLE " : "
a3e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
a3f0: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
a400: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
a410: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
a420: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
a430: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
a440: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
a450: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a460: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
a470: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
a480: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
a490: 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74  += strlen(&zStmt
a4a0: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
a4b0: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
a4c0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
a4d0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
a4e0: 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d    if( (z = pCol-
a4f0: 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20  >zType)!=0 ){.  
a500: 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d      zStmt[k++] =
a510: 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63   ' ';.      strc
a520: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29  py(&zStmt[k], z)
a530: 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72  ;.      k += str
a540: 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  len(z);.    }.  
a550: 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d  }.  strcpy(&zStm
a560: 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  t[k], zEnd);.  r
a570: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
a580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a590: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a5a0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
a5b0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
a5c0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
a5d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a5e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
a5f0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a600: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
a610: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
a620: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
a630: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
a640: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
a650: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
a660: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
a670: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
a680: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
a690: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
a6a0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a6b0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
a6c0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
a6d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
a6e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a6f0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
a700: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
a710: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
a720: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
a730: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
a740: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
a750: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
a760: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
a770: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
a780: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
a790: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
a7a0: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
a7b0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
a7c0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
a7d0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
a7e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
a7f0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
a800: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
a810: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
a820: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
a830: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
a840: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
a850: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
a860: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
a870: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
a880: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
a890: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
a8a0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
a8b0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
a8c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
a8d0: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
a8e0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
a8f0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
a900: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
a910: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
a920: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a930: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
a940: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
a950: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
a960: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a970: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28  se->db;..  if( (
a980: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
a990: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
a9a0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
a9b0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
a9c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
a9d0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a9e0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
a9f0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
aa00: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
aa10: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
aa20: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
aa30: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
aa40: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
aa50: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
aa60: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
aa70: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
aa80: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
aa90: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
aaa0: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
aab0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
aac0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
aad0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
aae0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
aaf0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
ab00: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
ab10: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
ab20: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
ab30: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
ab40: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
ab50: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
ab60: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
ab70: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
ab80: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
ab90: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
aba0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
abb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
abc0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
abd0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
abe0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
abf0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
ac00: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
ac10: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
ac20: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
ac30: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
ac40: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
ac50: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
ac60: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
ac70: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
ac80: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
ac90: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
aca0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
acb0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
acc0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
acd0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
ace0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
acf0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
ad00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
ad10: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
ad20: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
ad30: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
ad40: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
ad50: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
ad60: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
ad70: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
ad80: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
ad90: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
ada0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
adb0: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
adc0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
add0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
ade0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
adf0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
ae00: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
ae10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ae20: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
ae30: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
ae40: 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
ae50: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20  e new table and 
ae60: 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
ae70: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41   stack..    ** A
ae80: 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f   view has no roo
ae90: 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70  tpage, so just p
aea0: 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20  ush a zero onto 
aeb0: 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20  the stack for.  
aec0: 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69    ** views.  Ini
aed0: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74  tialize zType at
aee0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
aef0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
af00: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
af10: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
af20: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
af30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af40: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  Op(v, OP_CreateT
af50: 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29  able, p->iDb, 0)
af60: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
af70: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
af80: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
af90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
afa0: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
afb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
afc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
afd0: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
afe0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
aff0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
b000: 20 22 56 49 45 57 22 3b 0a 20 20 20 20 7d 0a 0a   "VIEW";.    }..
b010: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
b020: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
b030: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
b040: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
b050: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
b060: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
b070: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
b080: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
b090: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
b0a0: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
b0b0: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
b0c0: 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e   the vdbe stack.
b0d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
b0e0: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
b0f0: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
b100: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
b110: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
b120: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
b130: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
b140: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
b150: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
b160: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
b170: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
b180: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
b190: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54  elect ){.      T
b1a0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
b1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b1c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
b1d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
b1e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b1f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d  , OP_Integer, p-
b200: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
b210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b220: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
b230: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
b240: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
b250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
b260: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
b270: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
b280: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   1, 0, 0, 0, 0);
b290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b2a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
b2b0: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
b2c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
b2d0: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
b2e0: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
b2f0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
b300: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
b310: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
b320: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
b330: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
b340: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
b350: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
b360: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
b370: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
b380: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
b390: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
b3a0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
b3b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65  = 0;.        pSe
b3c0: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
b3d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
b3e0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
b3f0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  elTab);.      }.
b400: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
b410: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
b420: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
b430: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
b440: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
b450: 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
b460: 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
b470: 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  tmt(p);.    }els
b480: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  e{.      n = Add
b490: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
b4a0: 72 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  r(pParse->sNameT
b4b0: 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20  oken.z) + 1;.   
b4c0: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
b4d0: 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54  e3MPrintf("CREAT
b4e0: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
b4f0: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
b500: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
b510: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
b520: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
b530: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
b540: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
b550: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
b560: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
b570: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
b580: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
b590: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
b5a0: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
b5b0: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
b5c0: 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66  ed.  The rowid f
b5d0: 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61  or the prealloca
b5e0: 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  ted.    ** slot 
b5f0: 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20  is the 2nd item 
b600: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  on the stack.  T
b610: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
b620: 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ack is the.    *
b630: 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  * root page for 
b640: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f  the new table (o
b650: 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73  r a 0 if this is
b660: 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f   a view)..    */
b670: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
b680: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
b690: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
b6a0: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
b6b0: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
b6c0: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
b6d0: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30  =%Q, rootpage=#0
b6e0: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
b6f0: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
b700: 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  1",.      db->aD
b710: 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c  b[p->iDb].zName,
b720: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d   SCHEMA_TABLE(p-
b730: 3e 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79  >iDb),.      zTy
b740: 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
b750: 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
b760: 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a  me,.      zStmt.
b770: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
b780: 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20  eFree(zStmt);.  
b790: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
b7a0: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e  ookie(db, v, p->
b7b0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
b7c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
b7d0: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
b7e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
b7f0: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
b800: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
b810: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
b820: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
b830: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
b840: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
b850: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74  /.    if( p->aut
b860: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62  oInc ){.      Db
b870: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
b880: 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20  [p->iDb];.      
b890: 69 66 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62  if( pDb->pSeqTab
b8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
b8b0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
b8c0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
b8d0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
b8e0: 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
b8f0: 65 6e 63 65 20 41 53 20 53 45 4c 45 43 54 20 25  ence AS SELECT %
b900: 51 20 41 53 20 6e 61 6d 65 2c 20 30 20 41 53 20  Q AS name, 0 AS 
b910: 73 65 71 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  seq;",.         
b920: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e   pDb->zName, p->
b930: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
b940: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
b960: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
b970: 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
b980: 52 54 20 49 4e 54 4f 20 25 51 2e 73 71 6c 69 74  RT INTO %Q.sqlit
b990: 65 5f 73 65 71 75 65 6e 63 65 20 56 41 4c 55 45  e_sequence VALUE
b9a0: 53 28 25 51 2c 30 29 22 2c 0a 20 20 20 20 20 20  S(%Q,0)",.      
b9b0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
b9c0: 70 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  p->zName.       
b9d0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
b9e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
b9f0: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
ba00: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
ba10: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
ba20: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
ba30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ba40: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
ba50: 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a 20  ma, p->iDb, 0,. 
ba60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
ba70: 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d  rintf("tbl_name=
ba80: 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c  '%q'",p->zName),
ba90: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
baa0: 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
bab0: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
bac0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
bad0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
bae0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
baf0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
bb00: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
bb10: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
bb20: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79   *pOld;.    FKey
bb30: 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44 62   *pFKey; .    Db
bb40: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
bb50: 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f  [p->iDb];.    pO
bb60: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
bb70: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c  Insert(&pDb->tbl
bb80: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
bb90: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
bba0: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
bbb0: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
bbc0: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
bbd0: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
bbe0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
bbf0: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
bc00: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
bc10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
bc20: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
bc30: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
bc40: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
bc50: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
bc60: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
bc70: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
bc80: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73  Key->pNextTo = s
bc90: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
bca0: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  pDb->aFKey, pFKe
bcb0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
bcc0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
bcd0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
bce0: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
bcf0: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
bd00: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
bd10: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
bd20: 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20   db->nTable++;. 
bd30: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
bd40: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
bd50: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  nges;.  }.}..#if
bd60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bd70: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
bd80: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
bd90: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
bda0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
bdb0: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
bdc0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
bdd0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
bde0: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
bdf0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
be00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
be10: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
be20: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
be30: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
be40: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
be50: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
be60: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
be70: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
be80: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
be90: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
bea0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
beb0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
bec0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
bed0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
bee0: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
bef0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
bf00: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
bf10: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
bf20: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
bf30: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
bf40: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
bf50: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
bf60: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
bf70: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
bf80: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
bf90: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
bfa0: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
bfb0: 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e;..  sqlite3Sta
bfc0: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
bfd0: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
bfe0: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
bff0: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
c000: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
c010: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
c020: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
c030: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
c040: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
c050: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
c060: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
c070: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
c080: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
c090: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c0a0: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
c0b0: 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22  Parse, p->iDb, "
c0c0: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
c0d0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
c0e0: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
c0f0: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
c100: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
c110: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
c120: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
c130: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
c140: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
c150: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
c160: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
c170: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
c180: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
c190: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
c1a0: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
c1b0: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
c1c0: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
c1d0: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
c1e0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
c1f0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
c200: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
c210: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
c220: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
c230: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
c240: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
c250: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
c260: 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  3SelectDup(pSele
c270: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ct);.  sqlite3Se
c280: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
c290: 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ct);.  if( !pPar
c2a0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
c2b0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
c2c0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
c2d0: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
c2e0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
c2f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
c300: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
c310: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
c320: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
c330: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
c340: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
c350: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
c360: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
c370: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
c380: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
c390: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
c3a0: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
c3b0: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
c3c0: 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74  >z;.  z = (const
c3d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
c3e0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
c3f0: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
c400: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
c410: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
c420: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
c430: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
c440: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
c450: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
c460: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
c470: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
c480: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
c490: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
c4a0: 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e  ble(pParse, &sEn
c4b0: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
c4c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c4d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
c4e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c4f0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
c500: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
c510: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
c520: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
c530: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
c540: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
c550: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
c560: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
c570: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
c580: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
c590: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
c5a0: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
c5b0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
c5c0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
c5d0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
c5e0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
c5f0: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
c600: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
c610: 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c  pTable){.  ExprL
c620: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53  ist *pEList;.  S
c630: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54  elect *pSel;.  T
c640: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
c650: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
c660: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c670: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69   );..  /* A posi
c680: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
c690: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
c6a0: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
c6b0: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
c6c0: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
c6d0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
c6e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
c6f0: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
c700: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
c710: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
c720: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
c730: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
c740: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
c750: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
c760: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
c770: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
c780: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
c790: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
c7a0: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
c7b0: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
c7c0: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
c7d0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
c7e0: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
c7f0: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
c800: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
c810: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
c820: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
c830: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
c840: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
c850: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
c860: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
c870: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
c880: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
c890: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
c8a0: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
c8b0: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
c8c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
c8d0: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
c8e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c8f0: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
c900: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
c910: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
c920: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
c930: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
c940: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
c950: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
c960: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
c970: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
c980: 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
c990: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
c9a0: 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c  ct ); /* If nCol
c9b0: 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65  ==0, then pTable
c9c0: 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20   must be a VIEW 
c9d0: 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62  */.  pSel = pTab
c9e0: 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  le->pSelect;..  
c9f0: 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  /* Note that the
ca00: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ca10: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
ca20: 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
ca30: 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
ca40: 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69  ments in this li
ca50: 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  st.  But we will
ca60: 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65   need to restore
ca70: 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62   the list.  ** b
ca80: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
ca90: 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nal configuratio
caa0: 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f  n afterwards, so
cab0: 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20   we save a copy 
cac0: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67  of.  ** the orig
cad0: 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a  inal in pEList..
cae0: 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20    */.  pEList = 
caf0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  pSel->pEList;.  
cb00: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSel->pEList = s
cb10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cb20: 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  p(pEList);.  if(
cb30: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30   pSel->pEList==0
cb40: 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45   ){.    pSel->pE
cb50: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
cb60: 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a     return 1;  /*
cb70: 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a   Malloc failed *
cb80: 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  /.  }.  pTable->
cb90: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65  nCol = -1;.  pSe
cba0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
cbb0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
cbc0: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29  pParse, 0, pSel)
cbd0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20  ;.  if( pSelTab 
cbe0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
cbf0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
cc00: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
cc10: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
cc20: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  ol;.    pTable->
cc30: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
cc40: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
cc50: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
cc60: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
cc70: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
cc80: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
cc90: 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65  elTab);.    DbSe
cca0: 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65  tProperty(pParse
ccb0: 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44  ->db, pTable->iD
ccc0: 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  b, DB_UnresetVie
ccd0: 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ws);.  }else{.  
cce0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
ccf0: 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a   0;.    nErr++;.
cd00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
cd10: 65 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b  ectUnbind(pSel);
cd20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
cd30: 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70  stDelete(pSel->p
cd40: 45 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e  EList);.  pSel->
cd50: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
cd60: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
cd70: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   .}.#endif /* SQ
cd80: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
cd90: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
cda0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
cdb0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
cdc0: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
cdd0: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
cde0: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
cdf0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
ce00: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
ce10: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
ce20: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
ce30: 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
ce40: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
ce50: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
ce60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
ce70: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
ce80: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
ce90: 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  .tblHash); i; i=
cea0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
ceb0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
cec0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
ced0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
cee0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
cef0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65  {.      sqliteRe
cf00: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
cf10: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
cf20: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
cf30: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
cf40: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
cf50: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
cf60: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
cf70: 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
cf80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
cf90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
cfa0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
cfb0: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
cfc0: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
cfd0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
cfe0: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
cff0: 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
d000: 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
d010: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
d020: 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
d030: 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
d040: 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
d050: 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
d060: 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
d070: 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  To..*/.#ifndef S
d080: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d090: 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
d0a0: 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
d0b0: 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72  Db *pDb, int iFr
d0c0: 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
d0d0: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
d0e0: 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  .  .  for(pElem=
d0f0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
d100: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  &pDb->tblHash); 
d110: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
d120: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
d130: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
d140: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
d150: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
d160: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
d170: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
d180: 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
d190: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  o;.      return;
d1a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
d1b0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
d1c0: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69 64 78  hFirst(&pDb->idx
d1d0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
d1e0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
d1f0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
d200: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
d210: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
d220: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
d230: 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
d240: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
d250: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
d260: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
d270: 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a 7d  }.  assert(0);.}
d280: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
d290: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
d2a0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
d2b0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
d2c0: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
d2d0: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
d2e0: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
d2f0: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
d300: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
d310: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
d320: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
d330: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
d340: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
d350: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
d360: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
d370: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
d380: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
d390: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
d3a0: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
d3b0: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
d3c0: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
d3d0: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
d3e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
d3f0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
d400: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d420: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
d430: 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a  , iTable, iDb);.
d440: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d450: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d460: 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70   /* OP_Destroy p
d470: 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72  ushes an integer
d480: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
d490: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
d4a0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
d4b0: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
d4c0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
d4d0: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
d4e0: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
d4f0: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
d500: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
d510: 6d 6f 64 69 66 69 73 20 74 68 65 20 73 71 6c 69  modifis the sqli
d520: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d530: 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
d540: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
d550: 54 68 65 20 22 23 30 22 20 69 6e 20 74 68 65 20  The "#0" in the 
d560: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
d570: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
d580: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
d590: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74  lue.  ** is on t
d5a0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
d5b0: 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ack.  See sqlite
d5c0: 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e  3RegisterExpr().
d5d0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
d5e0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
d5f0: 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
d600: 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
d610: 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 30 20  age=%d WHERE #0 
d620: 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22  AND rootpage=#0"
d630: 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
d640: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
d650: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
d660: 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23  iDb), iTable);.#
d670: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  endif.}../*.** W
d680: 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
d690: 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
d6a0: 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
d6b0: 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
d6c0: 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
d6d0: 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
d6e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d6f0: 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
d700: 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
d710: 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
d720: 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
d730: 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
d740: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
d750: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
d760: 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
d770: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
d780: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
d790: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
d7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d7b0: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
d7c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
d7d0: 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
d7e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d7f0: 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
d800: 2a 70 49 64 78 3b 0a 20 20 64 65 73 74 72 6f 79  *pIdx;.  destroy
d810: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
d820: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61   pTab->tnum, pTa
d830: 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  b->iDb);.  for(p
d840: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
d850: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
d860: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
d870: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
d880: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
d890: 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20  m, pIdx->iDb);. 
d8a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66   }.#else.  /* If
d8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
d8c0: 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d  y be auto-vacuum
d8d0: 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c   capable (if SQL
d8e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d8f0: 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  UUM.  ** is not 
d900: 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69  defined), then i
d910: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
d920: 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  o call OP_Destro
d930: 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61  y on the.  ** ta
d940: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f  ble and index ro
d950: 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65  ot-pages in orde
d960: 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  r, starting with
d970: 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
d980: 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72   .  ** largest r
d990: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
d9a0: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
d9b0: 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
d9c0: 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a  e root-pages.  *
d9d0: 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  * to be destroye
d9e0: 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62  d is relocated b
d9f0: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f  y an earlier OP_
da00: 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66  Destroy. i.e. if
da10: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77   the.  ** follow
da20: 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a  ing were coded:.
da30: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73    **.  ** OP_Des
da40: 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e  troy 4 0.  ** ..
da50: 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  ..  ** OP_Destro
da60: 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y 5 0.  **.  ** 
da70: 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20  and root page 5 
da80: 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74  happened to be t
da90: 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
daa0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  page number in t
dab0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
dac0: 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65  , then root page
dad0: 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65   5 would be move
dae0: 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74  d to page 4 by t
daf0: 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73  he .  ** "OP_Des
db00: 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65  troy 4 0" opcode
db10: 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74  . The subsequent
db20: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30   "OP_Destroy 5 0
db30: 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a  " would hit.  **
db40: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67   a free-list pag
db50: 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  e..  */.  int iT
db60: 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ab = pTab->tnum;
db70: 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65  .  int iDestroye
db80: 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
db90: 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20   1 ){.    Index 
dba0: 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69  *pIdx;.    int i
dbb0: 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20  Largest = 0;..  
dbc0: 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64    if( iDestroyed
dbd0: 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73  ==0 || iTab<iDes
dbe0: 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20  troyed ){.      
dbf0: 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b  iLargest = iTab;
dc00: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
dc10: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
dc20: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
dc30: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
dc40: 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78   int iIdx = pIdx
dc50: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73  ->tnum;.      as
dc60: 73 65 72 74 28 20 70 49 64 78 2d 3e 69 44 62 3d  sert( pIdx->iDb=
dc70: 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20  =pTab->iDb );.  
dc80: 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
dc90: 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
dca0: 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
dcb0: 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
dcc0: 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
dcd0: 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
dce0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
dcf0: 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 20 72 65  iLargest==0 ) re
dd00: 74 75 72 6e 3b 0a 20 20 20 20 64 65 73 74 72 6f  turn;.    destro
dd10: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
dd20: 2c 20 69 4c 61 72 67 65 73 74 2c 20 70 54 61 62  , iLargest, pTab
dd30: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 44 65 73  ->iDb);.    iDes
dd40: 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
dd50: 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  t;.  }.#endif.}.
dd60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
dd70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
dd80: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
dd90: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
dda0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
ddb0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
ddc0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
ddd0: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
dde0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
ddf0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
de00: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
de10: 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
de20: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
de30: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
de40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
de50: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
de60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
de70: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
de80: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
de90: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
dea0: 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  le;.  assert( pN
deb0: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
dec0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
ded0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
dee0: 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
def0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
df00: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a  0].zDatabase);..
df10: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
df20: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
df30: 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54  able;.  iDb = pT
df40: 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72  ab->iDb;.  asser
df50: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
df60: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e  <db->nDb );.#ifn
df70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
df80: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
df90: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
dfa0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
dfb0: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
dfc0: 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a  BLE(pTab->iDb);.
dfd0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
dfe0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54  zDb = db->aDb[pT
dff0: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ab->iDb].zName;.
e000: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e010: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e020: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e030: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
e040: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e050: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e060: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
e070: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44   ){.      if( iD
e080: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
e090: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e0a0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
e0b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e0c0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e0d0: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
e0e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e0f0: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
e100: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
e110: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
e120: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
e130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
e140: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e150: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
e160: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
e170: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
e180: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
e190: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
e1a0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
e1b0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e1d0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e1e0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e1f0: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
e200: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
e210: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e220: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e230: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
e240: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
e250: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
e260: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e270: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
e280: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
e290: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e2a0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
e2b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
e2c0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
e2d0: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
e2e0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
e2f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e300: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e310: 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
e320: 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
e330: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e340: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
e350: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
e360: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
e370: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
e380: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e390: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
e3a0: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
e3b0: 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
e3c0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
e3d0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e3e0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  op_table;.  }.. 
e3f0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
e400: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
e410: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
e420: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
e430: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
e440: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e450: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
e460: 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67  f( v ){.    Trig
e470: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
e480: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 54 61     int iDb = pTa
e490: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62 20 2a  b->iDb;.    Db *
e4a0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
e4b0: 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db];.    sqlite3
e4c0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
e4d0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
e4e0: 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  Db);..    /* Dro
e4f0: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
e500: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
e510: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
e520: 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20  ropped. Code.   
e530: 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
e540: 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
e550: 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
e560: 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20  aster and/or.   
e570: 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
e580: 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
e590: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
e5a0: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e  Trigger = pTab->
e5b0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68  pTrigger;.    wh
e5c0: 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
e5d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e5e0: 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 69 44  Trigger->iDb==iD
e5f0: 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69  b || pTrigger->i
e600: 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  Db==1 );.      s
e610: 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
e620: 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
e630: 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  igger, 1);.     
e640: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
e650: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
e660: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
e670: 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
e680: 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
e690: 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
e6a0: 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
e6b0: 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
e6c0: 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
e6d0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
e6e0: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
e6f0: 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
e700: 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
e710: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
e720: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
e730: 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
e740: 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
e750: 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
e760: 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
e770: 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
e780: 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
e790: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
e7a0: 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
e7b0: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
e7c0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
e7d0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
e7e0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
e7f0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
e800: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
e810: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
e820: 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
e830: 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
e840: 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
e850: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
e860: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
e870: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e880: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
e890: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
e8a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
e8b0: 62 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  b);.    }..#ifnd
e8c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e8d0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
e8e0: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
e8f0: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
e900: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
e910: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
e920: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
e930: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
e940: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ed */.    if( pT
e950: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20  ab->autoInc ){. 
e960: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
e970: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
e980: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
e990: 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73  FROM %s.sqlite_s
e9a0: 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
e9b0: 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  me=%Q",.        
e9c0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  pDb->zName, pTab
e9d0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
e9e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
e9f0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
ea00: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
ea10: 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
ea20: 6e 61 6c 20 73 63 68 65 6d 61 0a 20 20 20 20 2a  nal schema.    *
ea30: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
ea40: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
ea50: 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54  able, iDb, 0, pT
ea60: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
ea70: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
ea80: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
ea90: 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
eaa0: 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
eab0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
eac0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ead0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
eae0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
eaf0: 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
eb00: 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
eb10: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
eb20: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
eb30: 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
eb40: 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
eb50: 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
eb60: 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
eb70: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
eb80: 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
eb90: 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
eba0: 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
ebb0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
ebc0: 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
ebd0: 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
ebe0: 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
ebf0: 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20   to.  pToCol is 
ec00: 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
ec10: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   in the other.**
ec20: 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20   pTo table that 
ec30: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
ec40: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67  points to.  flag
ec50: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
ec60: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
ec70: 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
ec80: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
ec90: 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
eca0: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
ecb0: 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
ecc0: 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
ecd0: 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
ece0: 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
ecf0: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
ed00: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
ed10: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
ed20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
ed30: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
ed40: 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
ed50: 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a    The new FKey.*
ed60: 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20  * is not linked 
ed70: 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61  into db->aFKey a
ed80: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74  t this point - t
ed90: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  hat does not hap
eda0: 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c  pen.** until sql
edb0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
edc0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
edd0: 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
ede0: 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
edf0: 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
ee00: 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
ee10: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
ee20: 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
ee30: 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
ee40: 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
ee50: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
ee60: 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
ee70: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ee80: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ee90: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
eea0: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
eeb0: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
eec0: 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
eed0: 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
eee0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
eef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ef00: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
ef10: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
ef20: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
ef30: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
ef40: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
ef50: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
ef60: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
ef70: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
ef80: 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
ef90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
efa0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
efb0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
efc0: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  0;.  Table *p = 
efd0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
efe0: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
eff0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
f000: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
f010: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
f020: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
f030: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
f040: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
f050: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
f060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
f070: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
f080: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67    if( iCol<0 ) g
f090: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
f0a0: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
f0b0: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
f0c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f0d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f0e0: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
f0f0: 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
f100: 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
f110: 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
f120: 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
f130: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
f140: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
f150: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
f160: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
f170: 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
f180: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
f190: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
f1a0: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
f1b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f1c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f1d0: 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
f1e0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
f1f0: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
f200: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
f210: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
f220: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
f230: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
f240: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
f250: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
f260: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
f270: 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
f280: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
f290: 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
f2a0: 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
f2b0: 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
f2c0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
f2d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f2e0: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
f2f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
f300: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
f310: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
f320: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
f330: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
f340: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
f350: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
f360: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
f370: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
f380: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
f390: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
f3a0: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
f3b0: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
f3c0: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
f3d0: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
f3e0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
f3f0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
f400: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
f410: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
f420: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
f430: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
f440: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
f450: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
f460: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
f470: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
f480: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
f490: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
f4a0: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
f4b0: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
f4c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f4d0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f4e0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
f4f0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
f500: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
f510: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f520: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
f530: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
f540: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
f550: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
f560: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
f570: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
f580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f5a0: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
f5b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f5c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f5d0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
f5e0: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
f5f0: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
f600: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
f610: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
f620: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
f630: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
f640: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
f650: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
f660: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
f670: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
f680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
f690: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
f6a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
f6b0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
f6c0: 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
f6d0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
f6e0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
f6f0: 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
f700: 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
f710: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
f720: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
f730: 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
f740: 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61  deleteConf = fla
f750: 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b  gs & 0xff;.  pFK
f760: 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d  ey->updateConf =
f770: 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26   (flags >> 8 ) &
f780: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
f790: 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c  insertConf = (fl
f7a0: 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78  ags >> 16 ) & 0x
f7b0: 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  ff;..  /* Link t
f7c0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
f7d0: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
f7e0: 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
f7f0: 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
f800: 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
f810: 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
f820: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
f830: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
f840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f850: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
f860: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
f870: 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f  stDelete(pFromCo
f880: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
f890: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43  rListDelete(pToC
f8a0: 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
f8b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f8c0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
f8d0: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
f8e0: 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
f8f0: 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
f900: 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
f910: 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
f920: 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
f930: 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
f940: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
f950: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
f960: 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
f970: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
f980: 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
f990: 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
f9a0: 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
f9b0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
f9c0: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
f9d0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
f9e0: 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
f9f0: 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
fa00: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
fa10: 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
fa20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
fa30: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
fa40: 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
fa50: 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
fa60: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
fa70: 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
fa80: 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
fa90: 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
faa0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
fab0: 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72  erred = isDeferr
fac0: 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
fad0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
fae0: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
faf0: 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
fb00: 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
fb10: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
fb20: 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
fb30: 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
fb40: 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
fb50: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
fb60: 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
fb70: 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
fb80: 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
fb90: 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
fba0: 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
fbb0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
fbc0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
fbd0: 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
fbe0: 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  The memory cell 
fbf0: 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
fc00: 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
fc10: 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
fc20: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
fc30: 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
fc40: 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
fc50: 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
fc60: 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
fc70: 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
fc80: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
fc90: 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
fca0: 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
fcb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
fcc0: 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
fcd0: 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
fce0: 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
fcf0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
fd00: 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
fd10: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
fd20: 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
fd30: 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
fd40: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
fd50: 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
fd60: 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
fd70: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
fd80: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
fd90: 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  b;       /* Btre
fda0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
fdb0: 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
fdc0: 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
fdd0: 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74  Tab+1;     /* Bt
fde0: 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
fdf0: 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
fe00: 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe20: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
fe30: 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
fe40: 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe60: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
fe70: 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
fea0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
feb0: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
fec0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e 69  e */.  int isUni
fed0: 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
fee0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
fef0: 72 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  r a unique index
ff00: 20 2a 2f 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74   */..  v = sqlit
ff10: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ff20: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
ff30: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
ff40: 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
ff50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff60: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
ff70: 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c  ad, memRootPage,
ff80: 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20   0);.    tnum = 
ff90: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
ffa0: 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
ffb0: 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
ffc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ffd0: 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e  Clear, tnum, pIn
ffe0: 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20  dex->iDb);.  }. 
fff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10000 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
10010 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29   pIndex->iDb, 0)
10020 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  ;.  sqlite3VdbeO
10030 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
10040 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a  te, iIdx, tnum,.
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64      (char*)&pInd
10070 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  ex->keyInfo, P3_
10080 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
10090 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
100a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
100b0 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  ->iDb, 0);.  sql
100c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
100d0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
100e0 61 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b  ab, pTab->tnum);
100f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10100 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
10110 43 6f 6c 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70  Columns, iTab, p
10120 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 61 64  Tab->nCol);.  ad
10130 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
10140 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
10150 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
10160 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
10170 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64  IndexKey(v, pInd
10180 65 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 73 55  ex, iTab);.  isU
10190 6e 69 71 75 65 20 3d 20 70 49 6e 64 65 78 2d 3e  nique = pIndex->
101a0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
101b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
101c0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75  ddOp(v, OP_IdxPu
101d0 74 2c 20 69 49 64 78 2c 20 69 73 55 6e 69 71 75  t, iIdx, isUniqu
101e0 65 29 3b 0a 20 20 69 66 28 20 69 73 55 6e 69 71  e);.  if( isUniq
101f0 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ue ){.    sqlite
10200 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
10210 20 2d 31 2c 20 22 69 6e 64 65 78 65 64 20 63 6f   -1, "indexed co
10220 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
10230 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43  ique", P3_STATIC
10240 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
10250 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10260 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
10270 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  1+1);.  sqlite3V
10280 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
10290 64 64 72 31 2c 20 73 71 6c 69 74 65 33 56 64 62  ddr1, sqlite3Vdb
102a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
102b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
102c0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
102d0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
102e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
102f0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
10300 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
10310 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
10320 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
10330 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74  le.  pIndex is t
10340 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
10350 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61  ndex .** and pTa
10360 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
10370 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
10380 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
10390 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
103a0 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
103b0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
103c0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
103d0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
103e0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
103f0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
10400 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
10410 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
10420 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10430 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
10440 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
10450 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
10460 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
10470 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
10480 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
10490 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
104a0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
104b0 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
104c0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
104d0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
104e0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
104f0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
10500 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
10510 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
10520 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
10530 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
10540 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
10550 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
10560 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
10570 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
10580 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
10590 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
105a0 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  rse,   /* All in
105b0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
105c0 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
105d0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
105e0 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
105f0 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
10600 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
10610 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
10620 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
10630 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
10640 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
10650 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
10660 2c 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  ,  /* Table to i
10670 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
10680 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
10690 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
106a0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
106b0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
106c0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
106d0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
106e0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
106f0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
10700 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
10710 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
10720 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
10730 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
10740 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
10750 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
10760 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
10770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
10780 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
10790 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
107a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
107b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
107c0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
107d0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
107e0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
107f0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
10800 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
10810 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
10820 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
10830 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
10840 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
10850 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
10860 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
10870 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20  sFix;    /* For 
10880 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
10890 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
108a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  le */.  int isTe
108b0 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp;      /* True
108c0 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
108d0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69   index */.  sqli
108e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
108f0 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62  ->db;..  int iDb
10900 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
10910 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
10920 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
10930 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
10940 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
10950 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
10960 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
10970 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  x to create */..
10980 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
10990 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
109a0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
109b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
109c0 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ndex;..  /*.  **
109d0 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
109e0 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
109f0 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
10a00 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
10a10 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
10a20 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
10a30 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
10a40 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
10a50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
10a60 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
10a70 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
10a80 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
10a90 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
10aa0 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
10ab0 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
10ac0 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
10ad0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
10ae0 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
10af0 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
10b00 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
10b10 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
10b20 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
10b30 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
10b40 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
10b50 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
10b60 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
10b70 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
10b80 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
10b90 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
10ba0 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
10bb0 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
10bc0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
10bd0 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  o 1..    */.    
10be0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
10bf0 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
10c00 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
10c10 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
10c20 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
10c30 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69   pTab && pTab->i
10c40 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  Db==1 ){.      i
10c50 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  Db = 1;.    }.. 
10c60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
10c70 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
10c80 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
10c90 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20  ", pName) &&.   
10ca0 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53       sqlite3FixS
10cb0 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
10cc0 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20  blName).    ){. 
10cd0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10ce0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10cf0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
10d00 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
10d10 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
10d20 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a  e->a[0].zName, .
10d30 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65          pTblName
10d40 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
10d50 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
10d60 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
10d70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
10d80 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62  ssert( iDb==pTab
10d90 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65  ->iDb );.  }else
10da0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
10db0 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
10dc0 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
10dd0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62  ewTable;.    iDb
10de0 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
10df0 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  }..  if( pTab==0
10e00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10e10 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
10e20 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
10e30 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
10e40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10e50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10e60 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
10e70 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
10e80 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
10e90 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10ea0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
10eb0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
10ec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10ed0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10ee0 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
10ef0 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
10f00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10f10 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73  _index;.  }.  is
10f20 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62  Temp = pTab->iDb
10f30 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ==1;..  /*.  ** 
10f40 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
10f50 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
10f60 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
10f70 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
10f80 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
10f90 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
10fa0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
10fb0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
10fc0 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
10fd0 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
10fe0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
10ff0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
11000 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
11010 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
11020 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11030 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
11040 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
11050 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
11060 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
11070 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
11080 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
11090 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
110a0 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
110b0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
110c0 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
110d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
110e0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
110f0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
11100 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
11110 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
11120 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
11130 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
11140 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
11150 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
11160 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
11170 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
11180 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
11190 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
111a0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
111b0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
111c0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
111d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
111e0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
111f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11200 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
11210 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
11220 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
11230 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
11240 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11250 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11260 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
11270 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
11280 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61       Index *pISa
11290 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
112a0 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
112b0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
112c0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
112d0 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
112e0 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
112f0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
11300 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
11310 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
11320 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
11330 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
11340 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11350 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61  .      if( (pISa
11360 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
11370 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
11380 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
11390 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a  ].zName))!=0 ){.
113a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
113b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
113c0 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
113d0 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
113e0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
113f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11400 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
11410 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
11420 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
11430 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
11440 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
11450 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11460 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
11470 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
11480 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
11490 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
114a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
114b0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
114c0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
114d0 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pName==0 ){.    
114e0 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
114f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
11500 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
11510 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
11520 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
11530 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
11540 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
11550 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
11560 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "_%d",n);.    zN
11570 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
11580 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
11590 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75  Name, "sqlite_au
115a0 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d  toindex_", pTab-
115b0 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63  >zName, zBuf, (c
115c0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28  har*)0);.    if(
115d0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
115e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
115f0 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ex;.  }..  /* Ch
11600 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
11610 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
11620 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
11630 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11640 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11650 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
11660 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
11670 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
11680 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
11690 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
116a0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
116b0 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
116c0 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
116d0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
116e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
116f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
11700 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
11710 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69  INDEX;.    if( i
11720 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49  sTemp ) i = SQLI
11730 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
11740 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
11750 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
11760 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
11770 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
11780 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
11790 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
117a0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
117b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
117c0 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
117d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
117e0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
117f0 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
11800 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
11810 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
11820 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
11830 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
11840 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
11850 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
11860 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
11870 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
11880 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
11890 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
118a0 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
118b0 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
118c0 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49  n = strlen(nullI
118d0 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
118e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
118f0 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e  tAppend(0, 0, &n
11900 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
11910 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
11920 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11930 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
11940 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
11950 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
11960 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
11970 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
11980 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
11990 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
119a0 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
119b0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
119c0 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
119d0 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69  f(CollSeq*))*pLi
119e0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69  st->nExpr );.  i
119f0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67  f( pIndex==0 ) g
11a00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11a10 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d  index;.  pIndex-
11a20 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
11a30 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
11a40 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e  fo.aColl[pList->
11a50 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78  nExpr];.  pIndex
11a60 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
11a70 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  )&pIndex->aiColu
11a80 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d  mn[pList->nExpr]
11a90 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65  ;.  strcpy(pInde
11aa0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  x->zName, zName)
11ab0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
11ac0 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
11ad0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
11ae0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
11af0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
11b00 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
11b10 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
11b20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64  pName==0;.  pInd
11b30 65 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a  ex->iDb = iDb;..
11b40 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
11b50 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
11b60 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
11b70 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
11b80 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
11b90 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
11ba0 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
11bb0 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
11bc0 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
11bd0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
11be0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
11bf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
11c00 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
11c10 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11c20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
11c30 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
11c40 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
11c50 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
11c60 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
11c70 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
11c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
11c90 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
11ca0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11cb0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
11cc0 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
11cd0 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
11ce0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
11cf0 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  me, pList->a[i].
11d00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
11d10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11d20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
11d30 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
11d40 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28  [i] = j;.    if(
11d50 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
11d60 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
11d70 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  rt( pList->a[i].
11d80 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a  pExpr->pColl );.
11d90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65        pIndex->ke
11da0 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d  yInfo.aColl[i] =
11db0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
11dc0 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pr->pColl;.    }
11dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64  else{.      pInd
11de0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11df0 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f  l[i] = pTab->aCo
11e00 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].pColl;.    
11e10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
11e20 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
11e30 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66  oll[i] );.    if
11e40 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
11e50 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c   && .        sql
11e60 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
11e70 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
11e80 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
11e90 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ]) .    ){.     
11ea0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11eb0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
11ec0 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79   }.  pIndex->key
11ed0 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c  Info.nField = pL
11ee0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
11ef0 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
11f00 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
11f10 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
11f20 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
11f30 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
11f40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
11f50 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
11f60 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
11f70 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
11f80 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
11f90 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
11fa0 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
11fb0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
11fc0 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
11fd0 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
11fe0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
11ff0 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
12000 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
12010 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
12020 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
12030 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
12040 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
12050 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
12060 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
12070 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
12080 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
12090 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
120a0 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
120b0 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
120c0 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
120d0 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
120e0 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
120f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
12100 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
12110 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
12120 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
12130 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
12140 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
12150 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
12160 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
12170 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
12180 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
12190 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
121a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
121b0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
121c0 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  one );.      ass
121d0 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49  ert( pIdx->autoI
121e0 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73  ndex );.      as
121f0 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e  sert( pIndex->on
12200 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
12210 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
12220 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64  x->nColumn!=pInd
12230 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f  ex->nColumn ) co
12240 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
12250 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
12260 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20  Column; k++){.  
12270 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12280 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
12290 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
122a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
122b0 20 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49    if( pIdx->keyI
122c0 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49  nfo.aColl[k]!=pI
122d0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
122e0 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  oll[k] ) break;.
122f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12300 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
12310 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
12320 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
12330 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
12340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
12350 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
12360 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
12370 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
12380 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
12390 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
123a0 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
123b0 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
123c0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
123d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
123e0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
123f0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
12400 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
12410 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
12420 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
12430 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
12440 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
12450 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
12460 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
12470 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
12480 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
12490 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
124a0 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
124b0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
124c0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
124d0 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
124e0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
124f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
12500 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
12510 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
12520 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
12530 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
12540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
12550 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12560 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
12570 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
12580 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
12590 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
125a0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
125b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
125c0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
125d0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
125e0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
125f0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
12600 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
12610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12620 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
12630 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12640 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
12650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
12660 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
12670 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
12680 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
12690 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
126a0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
126b0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
126c0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
126d0 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
126e0 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
126f0 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
12700 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
12710 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20  iDb].idxHash, . 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
12740 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
12750 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  ndex->zName)+1, 
12760 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
12770 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
12780 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
12790 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
127a0 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
127b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
127c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
127d0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
127e0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
127f0 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
12800 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
12810 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
12820 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
12830 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
12840 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
12850 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
12860 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
12870 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
12880 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
12890 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
128a0 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
128b0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
128c0 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
128d0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
128e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
128f0 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
12900 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
12910 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
12920 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
12930 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
12940 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
12950 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
12960 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
12970 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
12980 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
12990 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
129a0 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
129b0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
129c0 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
129d0 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
129e0 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
129f0 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
12a00 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
12a10 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
12a20 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
12a30 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
12a40 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
12a50 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
12a60 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
12a70 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
12a80 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
12a90 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
12aa0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
12ab0 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
12ac0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
12ad0 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
12ae0 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
12af0 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
12b00 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
12b10 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
12b20 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
12b30 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
12b40 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12b50 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
12b60 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
12b70 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
12b80 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a  Parse->nMem++;..
12b90 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
12ba0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12bb0 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
12bc0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12bd0 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43  index;..    /* C
12be0 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
12bf0 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
12c00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
12c10 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
12c20 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
12c30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
12c40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12c50 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
12c60 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
12c70 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12c80 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
12c90 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  em, 0);..    /* 
12ca0 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
12cb0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
12cc0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
12cd0 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
12ce0 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
12cf0 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
12d00 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70   if( pStart && p
12d10 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  End ){.      /* 
12d20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
12d30 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
12d40 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
12d50 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
12d60 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
12d70 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73 20  rintf("CREATE%s 
12d80 49 4e 44 45 58 20 25 2e 2a 71 22 2c 0a 20 20 20  INDEX %.*q",.   
12d90 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
12da0 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
12db0 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20  NIQUE",.        
12dc0 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
12dd0 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b  Addr(pName->z) +
12de0 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
12df0 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
12e00 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
12e10 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
12e20 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
12e30 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
12e40 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
12e50 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
12e60 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
12e70 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
12e80 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
12e90 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
12ea0 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
12eb0 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
12ec0 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
12ed0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
12ee0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
12ef0 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
12f00 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
12f10 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29  ex',%Q,%Q,#0,%Q)
12f20 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
12f30 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
12f40 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
12f50 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
12f60 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
12f70 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
12f80 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
12f90 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
12fa0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
12fb0 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
12fc0 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
12fd0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
12fe0 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
12ff0 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
13000 68 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2f  he schema.    */
13010 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
13020 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
13030 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
13040 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d  arse, pIndex, iM
13050 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
13060 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
13070 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
13080 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
13090 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
130a0 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20  ma, iDb, 0,.    
130b0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
130c0 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c  ntf("name='%q'",
130d0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c   pIndex->zName),
130e0 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
130f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
13100 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
13110 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
13120 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
13130 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
13140 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
13150 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
13160 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
13170 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
13180 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
13190 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
131a0 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
131b0 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
131c0 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
131d0 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
131e0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
131f0 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
13200 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
13210 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
13220 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
13230 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
13240 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
13250 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
13260 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
13270 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
13280 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
13290 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
132a0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
132b0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
132c0 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
132d0 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
132e0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
132f0 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
13300 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
13310 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
13320 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
13330 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
13340 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
13350 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
13360 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
13370 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
13380 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
13390 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
133a0 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
133b0 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
133c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
133d0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
133e0 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
133f0 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
13400 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
13410 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
13420 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
13430 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  te(pTblName);.  
13440 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
13450 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
13460 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13470 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
13480 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
13490 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
134a0 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
134b0 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
134c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
134d0 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
134e0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
134f0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
13500 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
13510 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
13520 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13530 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
13540 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13550 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
13560 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
13570 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  rn;.  assert( pN
13580 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
13590 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
135a0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
135b0 6d 61 28 70 50 61 72 73 65 29 20 29 20 72 65 74  ma(pParse) ) ret
135c0 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  urn;.  pIndex = 
135d0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
135e0 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
135f0 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
13600 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
13610 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
13620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13630 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13640 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
13650 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
13660 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
13670 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
13680 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
13690 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
136a0 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
136b0 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
136c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
136d0 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
136e0 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
136f0 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
13700 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
13710 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
13720 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
13730 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
13740 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
13750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
13760 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
13770 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
13780 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
13790 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
137a0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
137b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
137c0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
137d0 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61  pIndex->iDb].zNa
137e0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
137f0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
13800 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e  A_TABLE(pIndex->
13810 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
13820 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
13830 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
13840 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
13850 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13860 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
13870 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
13880 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63   pIndex->iDb ) c
13890 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
138a0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
138b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
138c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
138d0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
138e0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
138f0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
13900 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
13910 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
13920 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
13930 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
13940 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
13950 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
13960 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
13970 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13980 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
13990 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20   ){.    int iDb 
139a0 3d 20 70 49 6e 64 65 78 2d 3e 69 44 62 3b 0a 20  = pIndex->iDb;. 
139b0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
139c0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
139d0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
139e0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
139f0 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64  me=%Q",.       d
13a00 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
13a10 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
13a20 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e  iDb),.       pIn
13a30 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
13a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
13a50 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
13a60 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
13a70 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
13a80 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
13a90 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
13aa0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
13ab0 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
13ac0 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
13ad0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
13ae0 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
13af0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
13b00 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
13b10 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
13b20 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
13b30 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
13b40 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
13b50 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
13b60 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
13b70 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
13b80 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
13b90 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
13ba0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
13bb0 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
13bc0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
13bd0 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
13be0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
13bf0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
13c00 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
13c10 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
13c20 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13c30 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
13c40 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
13c50 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49  .  if( pList->nI
13c60 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  d>=pList->nAlloc
13c70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49   ){.    struct I
13c80 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  dList_item *a;. 
13c90 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
13ca0 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
13cb0 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20  *2 + 5;.    a = 
13cc0 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
13cd0 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
13ce0 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69  Alloc*sizeof(pLi
13cf0 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
13d00 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
13d10 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
13d20 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
13d30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
13d40 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
13d50 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
13d60 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
13d70 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
13d80 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
13d90 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70  ));.  pList->a[p
13da0 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
13db0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
13dc0 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
13dd0 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
13de0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
13df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
13e00 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
13e10 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
13e20 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
13e30 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
13e40 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
13e50 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
13e60 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
13e70 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
13e80 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
13e90 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
13ea0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
13eb0 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
13ec0 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
13ed0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
13ee0 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
13ef0 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
13f00 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
13f10 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
13f20 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
13f30 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
13f40 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
13f50 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
13f60 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
13f70 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
13f80 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
13f90 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
13fa0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
13fb0 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
13fc0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
13fd0 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
13fe0 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
13ff0 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
14000 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
14010 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
14020 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
14030 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
14040 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
14050 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
14060 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
14070 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
14080 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
14090 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
140a0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
140b0 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
140c0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
140d0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
140e0 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
140f0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
14100 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
14110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
14120 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
14130 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
14140 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
14150 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
14160 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
14170 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
14180 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
14190 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
141a0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
141b0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
141c0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
141d0 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
141e0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
141f0 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
14200 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
14210 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14220 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
14230 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
14240 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
14250 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
14260 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
14270 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14280 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
14290 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
142a0 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
142b0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
142c0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
142d0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
142e0 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
142f0 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
14300 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
14310 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
14320 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
14330 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
14340 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
14350 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
14360 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14370 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14380 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
14390 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
143a0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
143b0 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
143c0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
143d0 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
143e0 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
143f0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
14400 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
14410 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
14420 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
14430 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
14440 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
14450 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
14460 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
14470 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
14480 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
14490 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
144a0 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
144b0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
144c0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
144d0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
144e0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
144f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
14500 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
14510 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
14520 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
14530 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
14540 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
14550 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
14560 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
14570 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
14580 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
14590 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
145a0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
145b0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
145c0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
145d0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
145e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  +){.    if( pLis
145f0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c  t->a[i].iCursor<
14600 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
14610 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
14620 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14630 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14640 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73  .** Add an alias
14650 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65   to the last ide
14660 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67  ntifier on the g
14670 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20  iven identifier 
14680 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
14690 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64 41  lite3SrcListAddA
146a0 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c  lias(SrcList *pL
146b0 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
146c0 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
146d0 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e   && pList->nSrc>
146e0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
146f0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
14700 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  .zAlias = sqlite
14710 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
14720 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Token);.  }.}../
14730 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
14740 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
14750 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
14760 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
14770 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
14780 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14790 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
147a0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
147b0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
147c0 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
147d0 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
147e0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
147f0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
14800 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
14810 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
14820 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
14830 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
14840 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
14850 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
14860 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
14870 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
14880 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
14890 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
148a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
148b0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
148c0 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
148d0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
148e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
148f0 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
14900 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
14910 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
14920 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
14930 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n -1;.}../*.** D
14940 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
14950 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
14960 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
14970 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
14980 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
14990 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c  lete(SrcList *pL
149a0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
149b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
149c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
149d0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
149e0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
149f0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
14a00 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
14a10 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
14a20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
14a30 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
14a40 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
14a50 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
14a60 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
14a70 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
14a80 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61    if( pItem->pTa
14a90 62 20 26 26 20 70 49 74 65 6d 2d 3e 70 54 61 62  b && pItem->pTab
14aa0 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
14ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
14ac0 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74  leteTable(0, pIt
14ad0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d  em->pTab);.    }
14ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
14af0 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  ctDelete(pItem->
14b00 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
14b10 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14b20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
14b30 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
14b40 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  lete(pItem->pUsi
14b50 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
14b60 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
14b70 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
14b80 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
14b90 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
14ba0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
14bb0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
14bc0 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
14bd0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
14be0 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70   int i;..  if( p
14bf0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
14c00 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
14c10 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
14c20 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14c30 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
14c40 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
14c50 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
14c60 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
14c70 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14c80 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
14c90 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
14ca0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14cb0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
14cc0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14cd0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
14ce0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
14cf0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
14d00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14d10 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14d20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d30 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
14d40 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54  ion, i, (type==T
14d50 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b  K_EXCLUSIVE)+1);
14d60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
14d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14d80 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
14d90 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
14da0 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
14db0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
14dc0 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
14dd0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
14de0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
14df0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
14e00 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
14e10 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
14e20 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
14e30 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
14e40 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
14e50 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
14e60 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
14e70 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
14e80 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14e90 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14ea0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
14eb0 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
14ec0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
14ed0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14ee0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
14ef0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14f00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
14f10 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
14f20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
14f30 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
14f40 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
14f50 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
14f60 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
14f70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
14f80 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
14f90 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
14fa0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
14fb0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
14fc0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
14fd0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
14fe0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
14ff0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
15000 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
15010 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15020 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15030 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
15040 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
15050 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
15060 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15070 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15080 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
15090 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
150a0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
150b0 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
150c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
150d0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
150e0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
150f0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
15100 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
15110 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
15120 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
15130 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
15140 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
15150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
15160 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
15170 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
15180 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
15190 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
151a0 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
151b0 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
151c0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
151d0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
151e0 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
151f0 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58  ry(db, 0, 0, MAX
15200 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62  _PAGES, &db->aDb
15210 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66  [1].pBt);.    if
15220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15240 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15250 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
15260 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
15270 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
15280 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
15290 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
152a0 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
152b0 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
152c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
152d0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
152e0 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f  lags & !db->auto
152f0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
15300 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
15310 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
15320 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a  aDb[1].pBt, 1);.
15330 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15350 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15360 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
15370 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
15380 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
15390 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
153a0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
153b0 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50  le");.        pP
153c0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
153d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
153e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
153f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
15400 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15410 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
15420 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
15430 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
15440 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
15450 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
15460 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
15470 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
15480 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
15490 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
154a0 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
154b0 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
154c0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
154d0 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
154e0 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
154f0 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
15500 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
15510 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
15520 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
15530 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
15540 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
15550 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
15560 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
15570 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
15580 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
15590 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
155a0 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
155b0 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
155c0 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
155d0 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
155e0 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
155f0 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
15600 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
15610 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
15620 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
15630 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
15640 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
15650 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
15660 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
15670 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
15680 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
15690 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
156a0 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
156b0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
156c0 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
156d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
156e0 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
156f0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
15700 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
15710 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
15720 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
15730 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
15740 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
15750 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
15760 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
15770 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
15780 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
15790 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
157a0 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
157b0 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
157c0 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
157d0 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
157e0 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
157f0 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
15800 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
15810 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
15820 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
15830 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
15840 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
15850 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
15860 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
15870 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
15880 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
15890 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
158a0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
158b0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
158c0 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
158d0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
158e0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
158f0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
15900 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
15910 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
15920 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
15930 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
15940 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
15950 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
15960 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
15970 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
15980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15990 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
159a0 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
159b0 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b>=0 ){.    asse
159c0 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
159d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
159e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
159f0 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
15a00 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
15a10 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d  32 );.    mask =
15a20 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28   1<<iDb;.    if(
15a30 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65   (pParse->cookie
15a40 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
15a50 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
15a60 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d  >cookieMask |= m
15a70 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ask;.      pPars
15a80 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
15a90 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  Db] = db->aDb[iD
15aa0 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
15ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  ;.      if( iDb=
15ac0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
15ad0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
15ae0 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20  abase(pParse);. 
15af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15b10 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
15b20 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
15b30 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
15b40 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
15b50 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
15b60 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
15b70 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
15b80 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
15b90 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
15ba0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
15bb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
15bc0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
15bd0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
15be0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
15bf0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
15c00 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
15c10 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
15c20 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
15c30 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
15c40 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
15c50 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
15c60 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
15c70 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
15c80 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
15c90 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
15ca0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
15cb0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
15cc0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
15cd0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
15ce0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
15cf0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
15d00 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
15d10 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
15d20 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
15d30 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
15d40 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
15d50 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
15d60 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
15d70 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
15d80 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
15d90 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
15da0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
15db0 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
15dc0 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
15dd0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
15de0 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
15df0 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
15e00 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
15e10 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
15e20 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
15e30 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
15e40 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
15e50 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
15e60 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
15e70 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
15e80 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
15e90 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
15ea0 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
15eb0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
15ec0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
15ed0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
15ee0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
15ef0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
15f00 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
15f10 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
15f20 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
15f30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15f40 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
15f50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
15f60 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
15f70 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
15f80 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
15f90 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
15fa0 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
15fb0 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d  ement && pParse-
15fc0 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
15fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15fe0 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
15ff0 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
16000 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 26 26  .  if( iDb!=1 &&
16010 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
16020 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20  [1].pBt!=0 ){.  
16030 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
16040 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
16050 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e  rse, setStatemen
16060 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 1);.  }.}../*
16070 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20   .** Return the 
16080 74 72 61 6e 73 69 65 6e 74 20 73 71 6c 69 74 65  transient sqlite
16090 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 75  3_value object u
160a0 73 65 64 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67  sed for encoding
160b0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20   conversions.** 
160c0 64 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d 70 69  during SQL compi
160d0 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  lation..*/.sqlit
160e0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
160f0 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
16100 75 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ue(sqlite3 *db){
16110 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56 61 6c  .  if( !db->pVal
16120 75 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  ue ){.    db->pV
16130 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 56 61  alue = sqlite3Va
16140 6c 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a 20 20  lueNew();.  }.  
16150 72 65 74 75 72 6e 20 64 62 2d 3e 70 56 61 6c 75  return db->pValu
16160 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e;.}../*.** Chec
16170 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
16180 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
16190 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
161a0 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
161b0 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
161c0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
161d0 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
161e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
161f0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
16200 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
16210 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  tch(CollSeq *pCo
16220 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
16230 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49  x){.  int n = pI
16240 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
16250 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ield;.  CollSeq 
16260 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  **pp = pIndex->k
16270 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20  eyInfo.aColl;.  
16280 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20  while( n-- ){.  
16290 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c    if( *pp==pColl
162a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
162b0 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74   pp++;.  }.  ret
162c0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
162d0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
162e0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
162f0 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
16300 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16310 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
16320 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
16330 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
16340 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
16350 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16360 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
16370 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
16380 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
16390 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c  able *pTab, Coll
163a0 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49  Seq *pColl){.  I
163b0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
163c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
163d0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
163e0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
163f0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
16400 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
16410 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
16420 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
16430 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( pColl==0 || co
16440 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f  llationMatch(pCo
16450 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ll,pIndex) ){.  
16460 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
16470 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
16480 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e  Parse, 0, pTab->
16490 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
164a0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
164b0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
164c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
164d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
164e0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
164f0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
16500 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
16510 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
16520 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
16530 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
16540 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
16550 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
16560 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
16570 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
16580 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16590 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
165a0 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
165b0 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
165c0 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  rse, CollSeq *pC
165d0 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
16600 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
16610 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
16620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16630 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
16640 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
16650 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16660 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
16670 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16680 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
16690 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
166a0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
166b0 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
166c0 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
166d0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
166e0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
166f0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
16700 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d  e */..  for(iDb=
16710 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
16720 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
16730 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
16740 69 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e  if( pDb==0 ) con
16750 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
16760 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
16770 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  st(&pDb->tblHash
16780 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
16790 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
167a0 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
167b0 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
167c0 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
167d0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
167e0 70 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pTab, pColl);.  
167f0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
16800 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16810 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
16820 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
16830 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
16840 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
16860 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
16870 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
16880 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
16890 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
168a0 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
168b0 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
168c0 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
168d0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
168e0 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
168f0 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
16900 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
16910 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
16920 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
16930 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
16940 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
16950 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
16960 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
16970 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
16980 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
16990 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
169a0 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
169b0 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
169c0 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
169d0 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
169e0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
169f0 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
16a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
16a10 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
16a20 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
16a30 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
16a40 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
16a50 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
16a60 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
16a70 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
16a80 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
16a90 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
16aa0 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
16ab0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
16ac0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16ad0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
16ae0 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
16af0 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
16b00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
16b10 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
16b20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
16b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16b40 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
16b50 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
16b60 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
16b70 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
16b80 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
16b90 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
16ba0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
16bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16bc0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
16bd0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
16be0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16bf0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
16c00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16c10 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
16c20 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
16c30 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16c40 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
16c50 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
16c60 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4e 61 6d  d */..  if( pNam
16c70 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d  e1==0 || pName1-
16c80 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  >z==0 ){.    rei
16c90 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
16ca0 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
16cb0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
16cc0 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70  ( pName2==0 || p
16cd0 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
16ce0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
16cf0 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
16d00 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65  , db->enc, pName
16d10 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c  1->z, pName1->n,
16d20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
16d30 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
16d40 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
16d50 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  rse, pColl);.   
16d60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
16d70 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
16d80 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
16d90 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
16da0 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
16db0 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
16dc0 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
16dd0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
16de0 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a  oken(pObjName);.
16df0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
16e00 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
16e10 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
16e20 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
16e30 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
16e40 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
16e50 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
16e60 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
16e70 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(z);.    retur
16e80 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
16e90 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
16ea0 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
16eb0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
16ec0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
16ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
16ee0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16ef0 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
16f00 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
16f10 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
16f20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
16f30 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
16f40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16f50 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
16f60 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
16f70 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
16f80 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
16f90 66 0a                                            f.